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

Substituting part of a function with variable input

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

我使用现有 table:

的 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() 相关?)无法得到东西工作(尝试粘贴、as.formula、sprintf、替代等)。

使用 cv(col1) 我试图将输出粘贴到转换函数中,但我得到的最远的结果是转换试图在使用 as.formula 时从环境(而不是列)中获取值。

cv = function(var){
  output = paste('(', paste(var, collapse = ' + '), ')', sep = '')
  return(output)
}

如有任何提示或想法,我们将不胜感激!

你把自己逼到了一个陌生的角落。这很容易用 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

您可以使用来自 dplyrmutate 获得类似的效果:

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 生态系统中做到这一点,这就是做到这一点的方法。