晚上好,我正在尝试合并几个数据集,我在R中的常规工具今晚失败了。考虑下面的df1和df2。
df1 = data.frame(a = c("a", "b", "c"),
b = c("1", "2", "3"),
c = c("x", "y", "z"))
df2 = data.frame(a = c("1", "b", "c", "d", "e"),
b = c("a", "2", "3", "4", "5"),
d = c("x2", "y2", "z2", "x3", "y3"))
在这两种情况下,列a和b都应该充当分组变量。例如,在df1中,当a=a,b=1,则c=x。给定我正在处理的数据的结构,a和b的实际顺序无关紧要,因此如果a=1,b=a,则c将仍然等于x。问题在于,我想将df1与新的df df2合并。df2的结构类似,但包含一个新的变量d。可以看出,df2包括一些与a相比向后的a和b组合。此外,b还有一些额外的观察结果。
我正在寻找的所需数据帧如下:
desired = data.frame(a = c("a", "b", "c"),
b = c("1", "2", "3"),
c = c("x", "y", "z"),
d = c("x2", "y2", "z2"))
可以看出,a、b和c的原始柱状结构得到了保留,我们在D柱中添加了这些结构。然而,我们没有添加任何新的观察结果。
我已经尝试将merge()
与by.x
、by.y
的不同组合一起使用。
我还尝试过使用各种left_join
和inner_join
,但我一直在处理仍然无法处理a/b列中不匹配的数据集。
感谢您提供的任何想法或帮助。
干杯
您可以两次使用left_join
df2和df1,并使用coalesce
-
library(dplyr)
df1 %>%
left_join(df2, by = c("a"="a", "b"="b")) %>%
left_join(df2, by = c("a"="b", "b"="a")) %>%
mutate(
d = coalesce(d.x, d.y)
) %>%
select(a,b,c,d)
a b c d
1 a 1 x x2
2 b 2 y y2
3 c 3 z z2
早上好。看来,a和b的实际顺序确实很重要。sort
你的df2
,或者两者兼而有之。
df2[1:2] <- t(apply(df2[1:2], 1, sort, decreasing=TRUE))
merge(df1, df2)
# a b c d
# 1 a 1 x x2
# 2 b 2 y y2
# 3 c 3 z z2