我一直在思考这个问题了整整一夜: 这里是我的矩阵:R,找到重复的行,而不管为了
'a' '#' 3
'#' 'a' 3
0 'I am' 2
'I am' 0 2
.....
我想治疗像前两行一样的行是相同的,因为它只是'a'和'#'的不同顺序。就我而言,我想删除这样的行。这个玩具的例子很简单,前两个是一样的,第三个和第四个是一样的。但在我的数据集中,我不知道'相同'行在哪里。
我在R.写道谢谢。
我一直在思考这个问题了整整一夜: 这里是我的矩阵:R,找到重复的行,而不管为了
'a' '#' 3
'#' 'a' 3
0 'I am' 2
'I am' 0 2
.....
我想治疗像前两行一样的行是相同的,因为它只是'a'和'#'的不同顺序。就我而言,我想删除这样的行。这个玩具的例子很简单,前两个是一样的,第三个和第四个是一样的。但在我的数据集中,我不知道'相同'行在哪里。
我在R.写道谢谢。
也许像这样的东西会为你工作。目前尚不清楚你的期望输出是什么。
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
,所以你只需用`重复来查找哪些项目(行)是重复的。
感谢您的帮助。但我的测试数据有问题:/// 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 ///我不知道如何让代码不显示同一条线。抱歉。 –
发生在我身上!原因可能是您的列名分配在x中。这就是发生了什么事情:'order(A)'整齐地排列行并返回列名的有序版本。然而,来自'lapply'的结果对象尊重列名并交给'duplicated'列名完好的版本。因此,重复考虑的内容与x相同!查看我的答案以获得解决方案。 – agoldev
首先,您可能需要参考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个字符。对于每一行,你循环并检查它们是否有这个字符。如果他们这样做,然后你减少并检查下一个字符。使用自行创建的递归函数来处理此问题,该函数将字符串中的值与数据框或矩阵中的所有其他行进行比较(然后仅将子集与不匹配任何其他行的子集进行比较)。
'duplicated'确实是正确的*函数*(不包),但我不确定这是如何帮助OP到达回答。 – A5C1D2H2I1M1N2O1R2T1
对我来说,这也产生了一个FALSE向量,这意味着它没有检测到重复。我认为这是发生了什么事:我有列在x中分配的名称。因此,尽管order(A)
整齐排列了行并返回了具有列名称的行的有序版本,但来自lapply的结果对象会尊重列名并将列的名称移交给duplicated()
版本,因为这些列是完好的(由于名称)。因此,duplicated()
认为与x相同!
我没有这个灵感来自@A手车和马海毛的答案,为我工作:
duplicated(t(apply(x, 1, sort)))
它也较短;)
注意,例如通过@A手车和马海毛作品与他的样本数据。但是如果你有命名的列,它会失败。
你想删除重复或只有一个? – CCurtis
你想得到什么输出? 'T T F T'还是'T T T T'? ('F'-not dup,'T'-dup) – bartektartanus
我觉得这很接近,但我得到一个错误。奇怪,因为它工作,如果你手动指定我和ñ,但当我让重复和控制他们失控。它应该标记所有重复行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