R、 查找重复的行,而不考虑顺序

R、 查找重复的行,而不考虑顺序,r,duplicate-data,R,Duplicate Data,我整晚都在思考这个问题: 这是我的矩阵: 'a' '#' 3 '#' 'a' 3 0 'I am' 2 'I am' 0 2 我想像对待前两行一样对待这两行,因为它只是“a”和“#”的不同顺序。在我的例子中,我想删除这样的行。 玩具示例很简单,前两个相同,第三个和第四个相同。但在我的数据集中,我不知道“相同”行在哪里 我是用R写的。谢谢。首先,你可能想参考一下。正如软件包所指出的,“duplicated()确定向量或数据帧的哪些元素与下标较小的元素重复,并返回一个逻辑向量,指示哪些元素(

我整晚都在思考这个问题: 这是我的矩阵:

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

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


我是用R写的。谢谢。

首先,你可能想参考一下。正如软件包所指出的,“duplicated()确定向量或数据帧的哪些元素与下标较小的元素重复,并返回一个逻辑向量,指示哪些元素(行)是重复的。”它们提供的一些示例包括:

示例1:

duplicated(iris)[140:143]
duplicated(iris3, MARGIN = c(1, 3))
示例2:

duplicated(iris)[140:143]
duplicated(iris3, MARGIN = c(1, 3))
示例3

anyDuplicated(iris)
示例4

anyDuplicated(x)
示例5

anyDuplicated(x, fromLast = TRUE)

编辑:如果您想长期这样做,您可以考虑将数据中的每一行逐字符地与其他每一行进行比较。为此,假设第一行有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

x对我来说,这也产生了一个FALSE向量,这意味着它没有检测到重复项。我想事情就是这样:我在x中指定了列名。因此,尽管
order(A)
对行进行了整齐的排序,并返回了带有列名的行的排序版本,但lapply生成的对象尊重列名,并将其交给
duplicated()
一个列完整(因为名称)的版本。因此,
duplicated()
所考虑的与x相同

我这样做的灵感来自于“一辆手推车和马海毛”的回答,这对我来说很有用:

duplicated(t(apply(x, 1, sort)))
它也比较短;)


请注意,@A Handcart和马海毛的示例使用了他的示例数据。但是,如果您已经命名了列,它将失败

您想删除两个副本还是只删除一个副本?您想获得什么输出
ftftt
ttt
?(
F
-not dup,
T
-dup)我认为这很接近,但我得到了一个错误。奇怪的是,如果手动指定i和n,它会工作,但当我让repeat和for控制它们时,它会出错。它应该标记所有重复的行。然后,您可以删除(i in 1:length(df[,1]){x=(1:length(df[,1]))x=x[!x==i]for(n in x){if(sort(df[i,])[1]==sort(df[n,])[1]&sort(df[i,])[2]==sort(df[n,])[3]==sort(df[n,1:3])我想要的输出是:F T F T或T F T F,在这种情况下,我可以使用指示器来选择重复的行
确实是正确的函数(不是包),但我不确定这如何帮助OP得出答案。谢谢你的帮助。但是我的测试数据有点错误:///x=matrix(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,]///duplicated(lappy)(1:nrow(yyy),function(y){a也发生在我身上!原因可能是在x中分配了列名。这就是发生的情况:
order(a)
整齐地对行进行排序,并返回带有列名的行的排序版本。但是,
lappy
的结果对象尊重列名,并将其交给
duplicated
一个列名完整的版本。因此,duplicated所考虑的与x相同!有关解决方案,请参阅我的答案。