2014-04-10 19 views
1

我一直在思考这个问题了整整一夜: 这里是我的矩阵:R,找到重复的行,而不管为了

'a' '#' 3 
'#' 'a' 3 
0 'I am' 2 
'I am' 0 2 

.....

我想治疗像前两行一样的行是相同的,因为它只是'a'和'#'的不同顺序。就我而言,我想删除这样的行。这个玩具的例子很简单,前两个是一样的,第三个和第四个是一样的。但在我的数据集中,我不知道'相同'行在哪里。

我在R.写道谢谢。

+1

你想删除重复或只有一个? – CCurtis

+1

你想得到什么输出? 'T T F T'还是'T T T T'? ('F'-not dup,'T'-dup) – bartektartanus

+0

我觉得这很接近,但我得到一个错误。奇怪,因为它工作,如果你手动指定我和ñ,但当我让重复和控制他们失控。它应该标记所有重复行NA。那么你可以将它们删除(for i(1:length(df [,1])){x =(1:length(df [,1])) x = x [!x == i] (nfx){if(sort(df [i,])[1] == sort(df [n,])[1]&sort(df [i,])[2] == sort(df [n ,])[2]&sort(df [i,])[3] == sort(df [n,])[3])df [n,1:3] < - NA} } – CCurtis

回答

3

也许像这样的东西会为你工作。目前尚不清楚你的期望输出是什么。

x <- structure(c("a", "#", "0", "I am", "#", "a", "I am", "0", "3", 
       "3", "2", "2"), .Dim = c(4L, 3L)) 
x 
#  [,1] [,2] [,3] 
# [1,] "a" "#" "3" 
# [2,] "#" "a" "3" 
# [3,] "0" "I am" "2" 
# [4,] "I am" "0" "2" 


duplicated(
    lapply(1:nrow(x), function(y){ 
    A <- x[y, ] 
    A[order(A)] 
    })) 
# [1] FALSE TRUE FALSE TRUE 

这基本上是按行分割矩阵,然后对每一行进行排序。 duplicated也适用于list,所以你只需用`重复来查找哪些项目(行)是重复的。

+0

感谢您的帮助。但我的测试数据有问题:/// x =矩阵(c(0,3,2,3,0,1,2,1,0),3,3)/// z = as.vector(X)/// IND = Z> = 1 /// Y = C( 'A', 'b', 'C')/// YY = expand.grid( Y,Y)//// YYY = cbind(YY,Z)[IND,] //// 复制( lapply(1:nrow(YYY),函数(y)的{ A < - YYY [y,] A [order(A)] })/// [1] FALSE FALSE FALSE FALSE FALSE FALSE ///我不知道如何让代码不显示同一条线。抱歉。 –

+0

发生在我身上!原因可能是您的列名分配在x中。这就是发生了什么事情:'order(A)'整齐地排列行并返回列名的有序版本。然而,来自'lapply'的结果对象尊重列名并交给'duplicated'列名完好的版本。因此,重复考虑的内容与x相同!查看我的答案以获得解决方案。 – agoldev

0

首先,您可能需要参考to the documentation for an excellent R package called duplicated。正如软件包所指出的,“duplicated()确定向量或数据框的哪些元素与下标较小的元素是重复的,并返回指示哪些元素(行)重复的逻辑向量。”它们提供的一些实例是:

实施例1:

duplicated(iris)[140:143] 

实施例2:

duplicated(iris3, MARGIN = c(1, 3)) 

示例3

anyDuplicated(iris) 

例4

anyDuplicated(x) 

例5

anyDuplicated(x, fromLast = TRUE) 

编辑:如果你想要做的很长的路,你可能会认为从数据中的每一行比较每隔一行的逐字符。要做到这一点,想象第一行有3个字符。对于每一行,你循环并检查它们是否有这个字符。如果他们这样做,然后你减少并检查下一个字符。使用自行创建的递归函数来处理此问题,该函数将字符串中的值与数据框或矩阵中的所有其他行进行比较(然后仅将子集与不匹配任何其他行的子集进行比较)。

+0

'duplicated'确实是正确的*函数*(不包),但我不确定这是如何帮助OP到达回答。 – A5C1D2H2I1M1N2O1R2T1

0

对我来说,这也产生了一个FALSE向量,这意味着它没有检测到重复。我认为这是发生了什么事:我有列在x中分配的名称。因此,尽管order(A)整齐排列了行并返回了具有列名称的行的有序版本,但来自lapply的结果对象会尊重列名并将列的名称移交给duplicated()版本,因为这些列是完好的(由于名称)。因此,duplicated()认为与x相同!

我没有这个灵感来自@A手车和马海毛的答案,为我工作:

duplicated(t(apply(x, 1, sort))) 

它也较短;)

注意,例如通过@A手车和马海毛作品与他的样本数据。但是如果你有命名的列,它会失败。