用变量输入替换函数的一部分
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
您可以使用来自 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
生态系统中做到这一点,这就是做到这一点的方法。
我想用可变输入替换部分转换函数。
我使用现有 table:
的 col1 子集创建了一个 dfcol1 = 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
您可以使用来自 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
生态系统中做到这一点,这就是做到这一点的方法。