我有两个这种格式的数据框。
df1:
id x y
1 2 3
2 4 5
3 6 7
4 8 9
5 1 1
df2:
id id2 v v2
1 t 11 21
1 b 12 22
2 t 13 23
2 b 14 24
3 t 15 25
3 b 16 26
4 b 17 27
因此,有时主'df'中的ID会出现两次(最大),有时出现一次,有时甚至根本不出现。预期结果将是:
df_merged:
id x y v.t v2.t v.b v2.b
1 2 3 11 21 12 22
2 4 5 13 23 24 24
3 6 7 15 25 16 26
4 8 9 NA NA 17 27
5 1 1 NA NA NA NA
我使用过merge,但是由于df2中的id2不匹配,我在df_merged中得到了两个id实例,如下所示:
id x y v v2
1 ...
1 ...
谢谢!
答案 0 :(得分:1)
我们可以先将df2
调整为正确的格式,然后进行正常的连接。
librar(dplyr)
library(tidyr)
df2 %>% gather(key,val,-id,-id2) %>% #Transfer from wide to long format for v and v2
mutate(new_key=paste0(key,'.',id2)) %>% #Create a new id2 as new_key
select(-id2,-key) %>% #de-select the unnessary columns
spread(new_key,val) %>% #Transfer back to wide foramt with right foramt for id
right_join(df1) %>% #right join df1 "To includes all rows in df1" using id
select(id,x,y,v.t,v2.t,v.b,v2.b) #rearrange columns name
Joining, by = "id"
id x y v.t v2.t v.b v2.b
1 1 2 3 11 21 12 22
2 2 4 5 13 23 14 24
3 3 6 7 15 25 16 26
4 4 8 9 NA NA 17 27
5 5 1 1 NA NA NA NA
答案 1 :(得分:0)
您可以仅使用merge
来解决此问题。根据{{1}}等于df2
还是id2
拆分b
。将这两个新对象与t
合并,最后将它们合并在一起。该代码包括另外一个步骤,该步骤还包括在df1
中找到的数据,但不包括在df1
中找到的数据。
df2