【发布时间】:2014-05-05 16:20:11
【问题描述】:
> part1<-data.frame(key=c(5,6,7,8,9),x=c("b","d","a","c","b"))
> part1
key x
1 5 b # key==5,x==b
2 6 d
3 7 a
4 8 c
5 9 b
> part2<-data.frame(key=c(1,2,3,4,5), x=c("c","a","b","d","a"))
> part2
key x
1 1 c
2 2 a
3 3 b
4 4 d
5 5 a # key==5,x==a
有超过 2 个数据帧,但我将在此示例中仅使用 2 个。然后我使用 lapply 将它们全部放在一个名为 dflist1 的列表中,然后对它们进行 rbind。对于这个示例,我将手动完成。
dflist1<-list(part1,part2)
final<-do.call(rbind,dflist1)
final<-final[order(final$key),] #sort by key
结果:
> final
key x
6 1 c
7 2 a
8 3 b
9 4 d
1 5 b #duplicate from part1
10 5 a #duplicate from part2
2 6 d
3 7 a
4 8 c
5 9 b
我想摆脱重复。它很容易使用 !duplicated() 但在这种情况下,我特别想删除/覆盖早期数据帧中的行 - 即,在这种情况下,第 1 部分中的“5 b”应该被第 2 部分中的“5 a”删除/覆盖.如果有一个值为“5 b”的 part3,那么来自 part2 的“5 a”将被来自 part3 的“5 b”删除/覆盖。
我想要什么:
key x
6 1 c
7 2 a
8 3 b
9 4 d
10 5 a #this is from part2, no more duplicate from part1
2 6 d
3 7 a
4 8 c
5 9 b
当前解决方案:我唯一能想到的就是添加一个函数,用一个额外的变量标记每个数据帧,然后对其进行排序并在该变量上使用 !duplicated ... 有没有更简单或更优雅的解决方案不需要标记?
【问题讨论】:
-
提示:使用
data.table(), setkey(), unique() -
另外,请注意,R 的排序函数是 stable sorting algorithm 并保留卫星数据,因此您可以反转、使用 !duplicated 并再次反转。
-
也许,
duplicated的“fromLast = T”参数可能有用?例如。final[!duplicated(final$key, fromLast = T), ]看起来像你的输出
标签: r duplicates rbind