我想用变量输入替换部分变换函数。
我使用现有表中col1的子集创建了一个df:
col1 = c('A','B','C')
df看起来像这样:
A = c(1, 3)
B = c(3, 1)
C = c(5, 2)
df = data.frame(A, B, C)
我现在想要自动进行手动计算的计算:
df <- transform(df, 'ABC' = (A + B + C))
其中(A + B + C)是指df的列。因为我有数百个'col1',所以我不能手工完成。我试图使用类似于%s的东西(在python 2.X中可用),但到目前为止没有什么真正起作用,我理解太少的R(与eval()相关?)以使工作正常(尝试粘贴,如.formula,sprintf,替代等)。
使用cv(col1)我试图将输出粘贴到转换函数中,但是我得到的最远的是转换尝试在使用as.formula时从环境(而不是列)中获取值。
cv = function(var){
output = paste('(', paste(var, collapse = ' + '), ')', sep = '')
return(output)
}
会欣赏任何提示或想法!
答案 0 :(得分:2)
你已经把自己变成了一个奇怪的角落。 R:
很容易cols <- c("A", "B", "C")
df[, paste(cols, collapse = "")] <- rowSums(df[, cols])
#alternatively for other binary functions:
#Reduce("+", df[, cols])
# A B C ABC
#1 1 3 5 9
#2 3 1 2 6
答案 1 :(得分:0)
您可以使用mutate
中的dplyr
获得类似效果:
library(dplyr)
cols <- c("A", "B", "C")
df %>% mutate_(.dots = setNames(paste(cols, collapse = '+'),
'new_column_name'))
我们告诉mutate_
{发现_
)通过paste()
做什么,产生"A+B+C"
,并使用setNames
来命名新列。
我承认语法有些复杂,但这与dplyr
中的non-standard evaluation有关。但是如果你想在dplyr
生态系统中这样做,这就是实现它的方法。