在R中,我尝试将数据帧(df1)中的选择列与第二个数据帧(df2)中的匹配列相乘。行数不相等(df2仅1),并且有些列我希望保留但不希望相乘。下面是一个示例:
df1 <- data.frame(group = c('A','B','C','A'), var1 = c(1,0,1,0), var2 = c(0,1,1,0))
df2 <- data.frame(var1 = 0.06, var2 = 0.04)
预期结果将是:
Group var1 var2
A 0.06 0
B 0 0.04
C 0.06 0.04
A 0 0
如果需要,我很高兴调整df2的格式。tidyverse解决方案将是巨大的。
我读过其他一些试图做类似事情的问题,但是我无法让它们在我的情况下起作用
data.frame(Map(function(x,y) if(all(is.numeric(x),is.numeric(y))) x * y
else x, df1, df2))
# Multiply's by position not name
提前致谢。
我们可以用rep
或来使长度相同,col
然后相乘
nm1 <- intersect(names(df1), names(df2))
df1[nm1] <- df1[nm1] * unlist(df2[nm1])[col(df1[nm1])]
df1
# group var1 var2
#1 A 0.06 0.00
#2 B 0.00 0.04
#3 C 0.06 0.04
#4 A 0.00 0.00
或使用 Map
df1[nm1] <- Map(`*`, df1[nm1], df2[nm1])
或使用 tidyverse
library(dplyr)
library(purrr)
map2_dfc(select(df1, nm1), select(df2, nm1), `*`) %>%
bind_cols(select(df1, -one_of(nm1)), .)
# group var1 var2
#1 A 0.06 0.00
#2 B 0.00 0.04
#3 C 0.06 0.04
#4 A 0.00 0.00
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句