【发布时间】:2019-04-25 16:29:14
【问题描述】:
考虑以下数据框(df):
"id" "a1" "b1" "c1" "not_relevant" "p_a1" "p_b1" "p_c1"
a 2 6 0 x 2 19 12
a 4 2 7 x 3.5 7 11
b 1 9 4 x 7 1.5 4
b 7 5 11 x 8 12 5
我想创建一个新列,显示两个对应列之间的乘积之和。为了编写更少的代码,我通过索引号对列进行寻址。不幸的是,我没有编写函数的经验,所以我最终手动编写,这非常繁琐且不是很优雅。
这是一个可重现的数据框示例以及我迄今为止尝试过的示例:
id <- c("a","a","b","b")
df <- data.frame(id)
df$a1 <- as.numeric((c(2,4,1,7)))
df$b1 <- as.numeric((c(6,2,9,5)))
df$c1 <- as.numeric((c(0,7,4,11)))
df$not_relevant <- c("x","x","x","x")
df$p_a1 <- as.numeric((c(2,3.5,7,8)))
df$p_b1 <- as.numeric((c(19,7,1.5,12)))
df$p_c1 <- as.numeric((c(12,11,4,5)))
require(dplyr)
df %>% mutate(total = .[[2]]*.[[6]] + .[[3]] *.[[7]]+ .[[4]] *.[[8]])
这会导致预期的结果,但正如我提到的那样效率不是很高:
"id" "a1" "b1" "c1" "not_relevant" "p_a1" "p_b1" "p_c1" "total"
a 2 6 0 x 2 19 12 118.0
a 4 2 7 x 3.5 7 11 105.0
b 1 9 4 x 7 1.5 4 36.5
b 7 5 11 x 8 12 5 171.0
我正在处理的真实数据有更多的列,所以如果有人能告诉我一种方法来将此操作打包到一个函数中,该函数循环遍历列索引号并将正确的列相互匹配,我会很高兴。
【问题讨论】:
标签: r function dataframe multiple-columns