用可变输入替换函数的一部分

时间:2017-02-14 11:58:11

标签: r string transform substitution

我想用变量输入替换部分变换函数。

我使用现有表中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)
}

会欣赏任何提示或想法!

2 个答案:

答案 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生态系统中这样做,这就是实现它的方法。