R,查找重复的行,无论顺序如何

时间:2014-04-10 06:43:10

标签: r duplicate-data

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

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

.....

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

我正在写R.谢谢。

3 个答案:

答案 0 :(得分: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上运行,所以你只需用`duplicated'来整理整个东西,找出哪些项(行)是重复的。

答案 1 :(得分:3)

对我来说,这也产生了一个FALSE向量,这意味着它没有检测到重复。我想这就是发生的事情:我在x中分配了列名。因此,虽然order(A)整齐排序行并返回带有列名的行的有序版本,但lapply生成的对象会尊重列名并将{0}}移交给列完整的版本(因为名字)。因此,duplicated()所考虑的与x相同!

我的灵感来自为我工作的@A Handcart And Mohair的答案:

duplicated()

它也更短;)

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

答案 2 :(得分:1)

首先,您可以参考to the documentation for an excellent R package called duplicated。正如包注释,&#34; duplicated()确定向量或数据帧的哪些元素是具有较小下标的元素的副本,并返回指示哪些元素(行)是重复的逻辑向量。&#34;他们提供的一些例子是:

示例1:

duplicated(iris)[140:143]

示例2:

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

<强>示例3

anyDuplicated(iris)

示例4

anyDuplicated(x)

示例5

anyDuplicated(x, fromLast = TRUE)

编辑:如果您想要做很多事情,您可能会考虑逐个字符地比较数据中的每一行到每一行。为此,假设第一行有3个字符。对于每一行,您循环并检查它们是否具有此字符。如果他们这样做,那么你减少并检查下一个字符。使用自己创建的递归函数来处理这个问题,该函数将字符串中的值与数据框或矩阵中的所有其他行(以及仅与任何其他行不匹配的行上的子集)进行比较,可以正常工作。