向量乘以每一行数据帧的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)
我有一个数据框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)