我想使用第三个 data.frame matches
来合并两个 data.frame,它提供了如何合并前两个 data.frame 的关键(id
和 number
是匹配的键。Class
应始终匹配,并作为附加检查)。
df2
应合并到 df1
,替换具有相同名称的列,并将 df2
中的变量插入到 df1
的相应行中(在这个例子中,这些行将被计分,但在我的真实例子中,大约有 20 多列应该在 30 左右的列中替换(其余 10 列将保持不变)。我希望这是清楚的,并提前非常感谢您的帮助如何有效地做到这一点。
它需要是 left_join
因为我想保留 df1
中的所有记录。 dplyr
是一个偏好!
df1 <- data.frame(1:10,
c("a","b","a","b","c","c","b","a","b","c"),
seq(20,38,2),
dnorm(10,5,2),
rnorm(10,78,5))
colnames(df1) <- c("id","class","score","misc","hc")
df2 <- data.frame(11:19,
c("g","d","a","e","c","d","f","a","b"),
seq(40,48,1),
dnorm(9,6,1),
rnorm(9,45,3))
colnames(df2) <- c("number","class","score","other","md")
matches <- data.frame(c("b","a","c","a"),
c(4,1,5,8),
c(19,18,15,13))
colnames(matches) <- c("class","id","number")
library(dplyr)
预期输出:
id class misc hc number score other md
1 a 0.00876415 70.85210 18 47 0.004431848 40.99189
2 b 0.00876415 81.27802 22 22 NA NA
3 a 0.00876415 69.19300 24 24 NA NA
4 b 0.00876415 75.86247 19 48 0.004431848 44.78242
5 c 0.00876415 69.18268 15 44 0.004431848 42.70708
6 c 0.00876415 80.49475 30 30 NA NA
7 b 0.00876415 76.52195 32 32 NA NA
8 a 0.00876415 73.52712 13 42 0.004431848 45.69842
9 b 0.00876415 81.50631 36 36 NA NA
10 c 0.00876415 80.55145 38 38 NA NA
最佳答案
使用dplyr
library(dplyr)
df1 %>% left_join(matches,by=c('id','class'),suffix=c('.df1','.df2')) %>%
left_join(df2,by=c('class','number'),suffix=c('.df1','.df2')) %>%
mutate(score=if_else(!is.na(score.df2),score.df2,score.df1)) %>%
select(-score.df1,score.df2)
关于r - 使用辅助 data.frame dplyr R 合并两个 data.frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52965957/