> 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()但在这种情况下我特别想要删除/覆盖早期数据帧中的行 - 即,在这种情况下,&#34; 5 b&#34;来自part1的应该被&#34; 5 a&#34;删除/覆盖来自第2部分。并且如果有一个值为&#34; 5 b&#34;那么&#34; 5 a&#34;然后,第2部分将被&#34; 5 b&#34;删除/覆盖。来自第3部分。
我想要的是什么:
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
当前的解决方案:我唯一能想到的是添加一个函数,用一个额外的变量标记每个数据帧,然后对它进行排序并在该变量上使用!duplicate ...是否有更简单或更优雅的解决方案#39; t需要标记?
答案 0 :(得分:0)
## Create many data.frames
set.seed(1)
## Normally, do this in lapply...
part1 <- data.frame(key=1:6, x=sample(letters, 6))
part2 <- data.frame(key=4:8, x=sample(letters, 5))
part3 <- data.frame(key=8:12, x=sample(letters, 5))
library(data.table)
## Collect all your "parts"
PARTS.LIST <- lapply(ls(pattern="^part\\d+"), function(x) get(x))
DT.part <- rbindlist(PARTS.LIST)
setkey(DT.part, key)
unique(DT.part, by="key")
ORIGINAL UNIQUE
--------- -----------
> DT.part > unique(DT.part, by="key")
key x key x
1: 1 l 1: 1 l
2: 2 v 2: 2 v
3: 3 k 3: 3 k
4: 4 q 4: 4 q
5: 4 i 5: 5 r
6: 5 r 6: 6 f
7: 5 w 7: 7 v
8: 6 f 8: 8 f
9: 6 o 9: 9 j
10: 7 v 10: 10 d
11: 8 f 11: 11 g
12: 8 l 12: 12 m
13: 9 j
14: 10 d
15: 11 g
16: 12 m