这感觉应该很明显,但是我真的没看到!
这是我正在处理的数据类型的一个微型示例:
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), ]
的方法),但显然不起作用,因为在任何单独的列中都没有重复项-这是关于该行中是否有任何内容。按字母顺序对行排序可能会有些问题,但我不确定这是否可行-我找不到任何内容(也看不到通常如何特别有用……)。
我的真实数据有数百行,因此手动进行识别这些组并不是很吸引人!
答案 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)