我想要这两个不同大小的数据帧。
a<- data.frame(Var1=c("a","a","b","b","d","d"), Var2=c(1,1,2,2,3,3),Var3=c(3,4,5,6,7,4))
b<- data.frame(Var1=c("a","b"), Var2=c(123,234),Var3=c(9,8))
我想做这样的事情
apply(a, 1, FUN = function(x) {
x[2:3]*b[b$Var1==x[1],2:3]
}
)
但是我收到以下错误:
Error in FUN(left, right) : non-numeric argument to binary operator
在两个数据帧之间获取数据帧(Var2和Var3)的最佳方法是什么?
答案 0 :(得分:3)
match
Var1
个密钥,然后将相应的部分相乘:
sel <- match(a$Var1, b$Var1)
a[!is.na(sel), 2:3] <- a[!is.na(sel), 2:3] * b[na.omit(sel), 2:3]
# Var1 Var2 Var3
#1 a 123 27
#2 a 123 36
#3 b 468 40
#4 b 468 48
#5 d 3 7
#6 d 3 4
答案 1 :(得分:1)
我们可以使用data.table
nm1 <- names(a)[-1]
setDT(a)[b, (nm1) := Map(`*`, mget(nm1), mget(paste0("i.", nm1))), on = .(Var1)]
a
# Var1 Var2 Var3
#1: a 123 27
#2: a 123 36
#3: b 468 40
#4: b 468 48
#5: d 3 7
#6: d 3 4