我有两个数据帧,我需要从这两个数据帧中添加两列,并将结果存储在原始的较大数据帧中,但是较大的数据帧比较小的数据帧具有更多的“分支”列。我尝试使用匹配,但不匹配的分支总和为NA
样例代码:
> df1 <- data.frame(branch = letters[seq(1,5)],
+ rev = seq(10,50,10),
+ stringsAsFactors = 0)
> df1
branch rev
1 a 10
2 b 20
3 c 30
4 d 40
5 e 50
>
> df2 <- data.frame(branch = c('b','d'),
+ Amt = c(10,10),
+ stringsAsFactors = 0)
> df2
branch Amt
1 b 10
2 d 10
>
> df1$rev + df2[match(df1$branch,df2$branch),2,drop = 1]
[1] NA 30 NA 50 NA
>
预期产量
> df1
branch rev
1 a 10
2 b 30
3 c 30
4 d 50
5 e 50
>
我尝试使用左联接,如下所示:
> left_join(df1, df2, by = 'branch')
branch rev Amt
1 a 10 NA
2 b 20 10
3 c 30 NA
4 d 40 10
5 e 50 NA
> df1 <- left_join(df1, df2, by = 'branch')
> df1[is.na(df1)] <- 0
> df1
branch rev Amt
1 a 10 0
2 b 20 10
3 c 30 0
4 d 40 10
5 e 50 0
> df1$rev <- df1$rev + df1$Amt
> df1
branch rev Amt
1 a 10 0
2 b 30 10
3 c 30 0
4 d 50 10
5 e 50 0
> df1$Amt <- NULL
> df1
branch rev
1 a 10
2 b 30
3 c 30
4 d 50
5 e 50
>
有人可以让我知道是否有一个更简单的解决方案。
一种方法是将的输出存储match
在变量中,设置replace
NA
为0,然后添加值
vals <- df2$Amt[match(df1$branch,df2$branch)]
df1$rev + replace(vals, is.na(vals), 0)
#[1] 10 30 30 50 50
类似的dplyr
,left_join
代替match
library(dplyr)
df1 %>%
left_join(df2, by = 'branch') %>%
mutate(Amt = replace(Amt, is.na(Amt), 0),
rev = rev + Amt) %>%
select(names(df1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句