【问题标题】:Substituting part of a function with variable input用可变输入替换函数的一部分
【发布时间】:2017-02-14 11:58:11
【问题描述】:

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

我已经使用来自现有表的 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)
}

不胜感激任何提示或想法!

【问题讨论】:

    标签: r string transform substitution


    【解决方案1】:

    你把自己逼到了一个奇怪的角落。使用 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
    

    【讨论】:

    • Reduce 解决方案非常好。
    【解决方案2】:

    你可以使用mutate from dplyr获得类似的效果:

    library(dplyr)
    cols <- c("A", "B", "C")
    df %>% mutate_(.dots = setNames(paste(cols, collapse = '+'), 
                                    'new_column_name'))
    

    在这里,我们通过生成"A+B+C"paste() 告诉mutate_(发现_)做什么,并使用setNames 来命名新列。

    我承认语法有些复杂,但这与dplyr 中的non-standard evaluation 有关。但是,如果您想在dplyr 生态系统中这样做,这就是这样做的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2018-09-22
      • 2022-11-23
      • 1970-01-01
      • 2022-12-08
      相关资源
      最近更新 更多