2017-02-14 80 views
0

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

我已创建使用带COL1子集从现有的表中的DF:

col1 = c('A','B','C') 

东风看起来是这样的:

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

你已经把自己变成了一个陌生的角落。这是很容易与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 
+0

哦,男孩..非常感谢你! – Daan11

+0

'Reduce'解决方案非常好。 –

0

您可以从dplyr得到使用mutate类似的效果:

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生态系统中执行此操作,则可以这样做。