我有3个数据帧。 第一个df包含一列 - 名称 -
df 1
Name
A
B
C
D
E
F
G
H
I
J
K
第二个df包含两列 - 名称和计数但是某些名称可能会或可能不会从第一个df中丢失。
df 2 -
Name Counts
A 12
B 23
C 34
D 56
E 34
K 44
我想比较从第二个df到第一个df的所有名称,如果没有名字丢失,那么很好。 如果缺少任何名称,则必须从第三个df填写该名称及其计数。第三个df将始终包含名称和计数。
df 3 -
Name Counts
A 34
B 45
C 34
D 56
E 67
F 435
G 45
H 76
I 76
J 88
K 90
所以在上面的例子中由于F,G,H,I,J在第二个df中缺失,因此应该从df 3添加它们的信息。
和 第二个df应更新为 -
Name Counts
A 12
B 23
C 34
D 56
E 34
F 435
G 45
H 76
I 76
J 88
K 44
这里的任何帮助都很棒
谢谢
答案 0 :(得分:2)
你可以......
library(data.table)
setDT(DF1); setDT(DF2); setDT(DF3)
DF1[, n := unique(rbind(DF2, DF3), by="Name")[.(.SD$Name), on=.(Name), x.Counts]]
向DF1添加一列:
Name n
1: A 12
2: B 23
3: C 34
4: D 56
5: E 34
6: F 435
7: G 45
8: H 76
9: I 76
10: J 88
11: K 44
您可以改为执行merge(DF1, unique(rbind(DF2, DF3), by="Name"), all.x=TRUE)
,但这会创建一个新表而不是向现有表添加列。此合并的dplyr模拟是left_join(DF1, bind_rows(DF2, DF3) %>% distinct(Name))
。
工作原理
DF = rbind(DF2, DF3)
附加两个源表uDF = unique(DF, by="Name")
保留每个Name
DF1[, n := z]
将n
列z
添加到DF1
z = x[i, on=, x.v]
使用i
查找x
行,然后返回列v
,其中......
x = uDF
v = Counts
i = .SD$Name
是DF1
.SD
的{{1}}中的{p> j
指的是DT[i, j]
本身,即“数据子集”。