【问题标题】:R, find duplicated rows , regardless of orderR,查找重复的行,不管顺序
【发布时间】:2014-04-10 06:43:09
【问题描述】:

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

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

.....

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

我正在用 R 写。谢谢。

【问题讨论】:

  • 您要删除两个重复项还是只删除一个?
  • 你想得到什么输出? F T F TT T T T ? (F-not dup,T-dup)
  • 我认为这非常接近,但我遇到了一个错误。奇怪,因为如果您手动指定 i 和 n 它会起作用,但是当我让重复并控制它们时,它会出错。它应该标记所有重复行 NA。那么你可以删除它们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,])[2]&sort(df[i,])[3]==sort(df[n,])[3]) df[n,1:3] <- NA} }
  • 我想要的输出是:F T F T 或 T F T F,这样我可以使用指标来挑选行

标签: r duplicate-data


【解决方案1】:

也许这样的东西对你有用。目前尚不清楚您想要的输出是什么。

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 也适用于 lists,因此您只需使用 `duplicated 将整个内容包装起来以查找哪些项目(行)是重复的。

【讨论】:

  • 感谢您的帮助。但是我的测试数据有问题:/// 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,]//// 重复( lapply(1:nrow(yyy), function(y){ A
  • 也发生在我身上!原因可能是您在 x 中分配了列名。这就是发生的情况:order(A) 整齐地对行进行排序,并返回行的有序版本以及列名。但是,来自lapply 的结果对象尊重列名并移交给duplicated 一个列名完整的版本。因此,duplicated 所考虑的内容与 x!请参阅我的答案以获得解决方案。
【解决方案2】:

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

我这样做的灵感来自于对我有用的@A Handcart And Mohair 的回答:

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

它也更短;)

请注意,@A Handcart And Mohair 的示例适用于他的示例数据。但是,如果您已命名列,则会失败。

【讨论】:

    【解决方案3】:

    首先,您可能需要参考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 确实是正确的 function (不是包),但我不确定这如何帮助 OP 得出答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2018-10-21
    • 2013-08-14
    相关资源
    最近更新 更多