在R中乘以不对称数据帧

时间:2017-05-02 23:23:33

标签: r

我想要这两个不同大小的数据帧。

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)的最佳方法是什么?

2 个答案:

答案 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