向量乘以每一行数据帧的R和

R sum of vector multiplied by each row of data frame

我有一个数据框df如下:

    prod sd  c1   c2   c3
1   NA   NA 0.5 0.25 0.25
2   NA   NA 0.5 0.50 0.00
3   NA   NA 0.5 0.00 0.50

还有一个向量v = c(0.1, 0.2, 0.3)

对于每一行,我想 "sumproduct" df$[,c(3:5)] * v 并将结果放入 df$prod,这样:

df$prod[1] <- (0.5 * 0.1) + (0.25 * 0.2) + (0.25 * 0.3)
df$prod[2] <- (0.5 * 0.1) + (0.5 * 0.2) + (0 * 0.3)

我已经阅读了许多关于复制 Excel 的 sumproduct 函数的不同主题,并尝试了很多不同的方法,但我一直无法想出一个可行的解决方案。如果有用的话,很乐意详细说明什么没有用,但我怀疑我忽略了一些非常简单的事情。非常感谢任何帮助。

尝试:

transform(df, prod = rowSums(sweep(df[, 3:5], 2, v, `*`)))

输出:

   prod sd  c1   c2   c3
1 0.175 NA 0.5 0.25 0.25
2 0.150 NA 0.5 0.50 0.00
3 0.200 NA 0.5 0.00 0.50

使用矩阵乘法:

df$prod <- as.matrix(df[3:5]) %*% v
   prod sd  c1   c2   c3
1 0.175 NA 0.5 0.25 0.25
2 0.150 NA 0.5 0.50 0.00
3 0.200 NA 0.5 0.00 0.50

可复现数据(请下次自行提供):

v <- c(0.1, 0.2, 0.3)

df <- read.csv(text =
"prod,sd,c1,c2,c3
NA,NA,0.5,0.25,0.25
NA,NA,0.5,0.50,0.00
NA,NA,0.5,0.00,0.50")

使用apply:

df$prod <- apply(df[,3:5], 1, function(x) sum(x*v))

df
   prod sd  c1   c2   c3
1 0.175 NA 0.5 0.25 0.25
2 0.150 NA 0.5 0.50 0.00
3 0.200 NA 0.5 0.00 0.50

你也可以这样解决:

df$prod <- colSums(t(df[, 3:5]) * v)

#    prod sd  c1   c2   c3
# 1 0.175 NA 0.5 0.25 0.25
# 2 0.150 NA 0.5 0.50 0.00
# 3 0.200 NA 0.5 0.00 0.50

数据

df <- read.table(text = "    prod sd  c1   c2   c3
1   NA   NA 0.5 0.25 0.25
2   NA   NA 0.5 0.50 0.00
3   NA   NA 0.5 0.00 0.50", header=T)