我有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
这里的任何帮助都会很棒
谢谢
你可以做...
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
的j
中的DT[i, j]
指的是DT
本身,即“数据子集”。