有许多类似的问题,但我想比较两列并删除两列中的所有重复项,以便剩下的所有内容都是每列中的唯一观察值。注意:重复项不是并排的。如果可能的话,我还想要一份重复列表(不仅仅是TRUE / FALSE)。谢谢!
C1 C2
1 a z
2 c d
3 f a
4 e c
会变成
C1 C2
1 f z
2 e d
有重复列表
duplicates: a, c
答案 0 :(得分:1)
这是另一个答案
where_dupe <- which(apply(df, 2, duplicated), arr.ind = T)
为您提供原始数据框中重复元素的位置。
col_unique <- setdiff(1:ncol(df), where_dupe)
为您提供哪些列没有重复
您可以通过索引查找值。
df[,col_unique]
答案 1 :(得分:0)
以下是使用duplicated
和lapply
的基本R方法。
temp <- unlist(df)
# get duplicated elements
myDupeVec <- unique(temp[duplicated(temp)])
# get list without duplicates
noDupesList <- lapply(df, function(i) i[!(i %in% myDupeVec)])
noDupesList
$C1
[1] "f" "e"
$C2
[1] "z" "d"
数据强>
df <- read.table(header=T, text=" C1 C2
1 a z
2 c d
3 f a
4 e c ", as.is=TRUE)
请注意,这会返回一个列表。这是更灵活的结构,因为通常存在一个级别可能在特定变量中重复多次的可能性。如果不是这种情况,您可以使用do.call
和data.frame
将结果放入矩形结构中。
do.call(data.frame, noDupesList)
C1 C2
1 f z
2 e d