【问题标题】:Calling & creating new columns based on string基于字符串调用和创建新列
【发布时间】:2017-01-18 22:29:26
【问题描述】:

我进行了相当多的搜索,但没有找到解决此问题的问题 - 但如果已经回答,请原谅我,总的来说,我在编码方面仍然很年轻。我有一个包含大量变量的数据框,我想根据我在循环中放入第二个数据框的名称组合并创建新变量。数据框formulas 应该从主数据框data 创建和调用列

USDb = c(1,2,3)
USDc = c(4,5,6)
EURb = c(7,8,9)
EURc = c(10,11,12)
data = data.frame(USDb, USDc, EURb, EURc)

现在我想创建一个由

定义的新列 data$USDa
data$USDa = data$USDb - data$USDc

对于 EUR 和其他变量,依此类推。这很容易手动完成,但我想创建一个循环,从formulas 中提取名称,如下所示:

a = c("USDa", "EURa")
b = c("USDb", "EURb")
c = c("USDc", "EURc")
formulas = data.frame(a,b,c)

for (i in 1:length(formulas[,a])){
    data$formulas[i,a] = data$formulas[i,b] - data$formulas[i,c]
    }

显然data$formulas[i,a] 这会返回NULL,所以我尝试了data$paste0(formulas[i,a]) 并返回Error: attempt to apply non-function

我怎样才能让这些字符串以这种方式被识别为变量?谢谢。

【问题讨论】:

    标签: r variables dataframe


    【解决方案1】:

    有更简单的方法可以做到这一点,但我会坚持使用您的大部分代码作为解释的手段。只要您将 for 循环编辑为以下内容,您的代码就应该可以工作:

    for (i in 1:length(formulas[,"a"])){
        data[formulas[i,"a"]] = data[formulas[i,"b"]] - data[formulas[i,"c"]]
    }
    
    1. formulas[,a] 不起作用,因为您已经有一个定义为 a 的变量在索引中不合适。如果您想要 data.frame formulas 中“a”列中的所有行,请改用 formulas[, "a"]
    2. data$formulas 实际上是在 data.frame data 中搜索名为“公式”的列。相反,您想写 data[formulas](当然,知道您需要索引 formulas 以使其成为正确的字符串)

    【讨论】:

      【解决方案2】:

      逻辑:遍历每个公式,使用 apply 内部循环,这是一个 for 循环,并根据公式进行计算

      x = apply(formulas, 1, function(x) data[[x[3]]] - data[[x[2]]])
      colnames(x) = formulas$a
      x
      #     USDa EURa
      #[1,]    3    3
      #[2,]    3    3
      #[3,]    3    3
      
      cbind(data, x)
      #  USDb USDc EURb EURc USDa EURa
      #1    1    4    7   10    3    3
      #2    2    5    8   11    3    3
      #3    3    6    9   12    3    3
      

      【讨论】:

      • 是的,这个解决方案适用于我拥有的实际数据,对我来说似乎比循环更优雅。感谢您的指导。
      【解决方案3】:

      另一个选项是splitsapply

      sapply(setNames(split.default(as.matrix(formulas[-1]), 
         row(formulas[-1])), formulas$a), function(x) Reduce(`-`, data[rev(x)]))
      #     USDa EURa
      #[1,]    3    3
      #[2,]    3    3
      #[3,]    3    3
      

      【讨论】:

        猜你喜欢
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        相关资源
        最近更新 更多