删除R中的重复行,即使顺序不同

时间:2019-01-10 15:03:16

标签: r

这感觉应该很明显,但是我真的没看到!

这是我正在处理的数据类型的一个微型示例:

x1 <- as.character(c("Apple", "Banana", "Cat", "Dog", "Orange"))
x2 <- as.character(c("Banana", "Orange", "Dog", "Cat", "Apple"))
x3 <- as.character(c("Orange", "Apple", NA, NA, "Banana"))         
groups <- data_frame(x1, x2, x3)

数据框有五行,但实际上只有两行是唯一的-当跨行读取时,其中一行包含三个水果,另一行包含两个动物。之所以有五行,是因为对于每种水果或动物,都有一行指示其所属的其他成员。

我要么想删除重复的行(我不关心要删除哪一行,只要每个组只剩下一行),或者在新列中有一个组名,所以仍然有五行,但还有一列类似"Fruit", "Fruit", "Animal", "Animal", "Fruit的列。使用第二个选项,我真的不在乎组名是什么,只要它们标识了不同的类别即可。

我已经研究过使用duplicated(类似groups[!duplicated(groups$x1), ]的方法),但显然不起作用,因为在任何单独的列中都没有重复项-这是关于该行中是否有任何内容。按字母顺序对行排序可能会有些问题,但我不确定这是否可行-我找不到任何内容(也看不到通常如何特别有用……)。

我的真实数据有数百行,因此手动进行识别这些组并不是很吸引人!

2 个答案:

答案 0 :(得分:1)

我不知道您的样本数据是否正在为我们提供您想要帮助的示例,但这是一个小技巧。正如其他评论中提到的那样,大多数工具会跨行查​​找唯一的对。如果配对没有关系,您可以执行以下操作:

    library(dplyr)

    x1 <- as.character(c("Apple", "Banana", "Cat", "Dog", "Orange"))
    x2 <- as.character(c("Banana", "Orange", "Dog", "Cat", "Apple"))
    x3 <- as.character(c("Orange", "Apple", NA, NA, "Banana"))         
    groups <- data_frame(x1, x2, x3)

    groups %>% 
       mutate_all(sort, na.last = TRUE) %>% 
       unique()

无论唯一性功能如何,如果它们在数据中出现的顺序确实很重要,它们将跨行查看唯一性配对。不过绝对慢,而且我敢肯定有些东西会更快。就像使用SELECT DISTINCT *的SQL一样。

答案 1 :(得分:1)

您可以以合理的方式重新排列数据后使用duplicated。一种明智的方法是使每个水果和动物具有TRUE/FALSE的值:与其将x1的值设为"dog",不如将dog的值设为{{1} }。例如,可以这样做:

TRUE

数据

g <- na.omit(unique(unlist(groups)))
df <- t(apply(as.matrix(groups), 1, function(x) g %in% x))
# if needed, you could make the `df` human-readable:
df <- setNames(as.data.frame(df), g)
duplicated(df)