【问题标题】:R use string as a variable name in a whole r scriptR 在整个 r 脚本中使用字符串作为变量名
【发布时间】:2017-11-07 16:45:44
【问题描述】:

我有一个 R 脚本,它可以计算多个线性模型以及 ggplots 等。现在我想用不断变化的变量来运行它。

取决于我的规格 df$targetX 应解释为:

df$target_37

lm(targetX ~ kelvin, df) 应该像我所说的那样计算线性模型:

lm(target_37 ~ kelvin, df)

我尝试了formula()paste()parse()eval(),但没有成功。 有没有一种方法可以指定 targetX 来实现这一点,而无需接触分析脚本?

targetX <- smartCommandIdontKnow("target_37")

【问题讨论】:

  • R 不是基于宏的语言。它是一种函数式语言,理想情况下,您将使用可以传递参数的函数来获得所需的行为。查找和替换类型解决方案不适用于索引和公式,因为它们是非常不同的语言结构/功能。
  • 嗯,在我的情况下,我必须定义许多函数,因为我想返回这么多对象。我更喜欢采购我的 script.R 文件。
  • 另外,您能发布您遇到的错误吗?此外,示例数据很有帮助,因此我们可以尝试和复制

标签: r string variables


【解决方案1】:

如何在基础 R 中解决这个问题,而 tidyverse (ggplot2) 通常是不同的。在不知道您要做什么的情况下,一种选择是使用 which(colnames(df)==targetX) 查找列号并将函数中的列重命名为函数使用的通用列。例如(帮助理解的长手):

smartCommandIdontKnow = function(colN){
  x=df
  id = which(colnames(x)==colN)
  colnames(x)[id] = "col_X"

  lm(col_X ~ kelvin, x)
}

【讨论】:

    【解决方案2】:

    这是一个使用 for 循环的最小建议。我认为您可能会沉迷于$-notation 引用变量的神奇方式。请记住,df[["variable"]] 等同于 df$variable

    df <- data.frame('target_37'= 1:5, 
                     'target_38' = 2*(1:5),
                     'target_39'= 3*(1:5),
                     'kelvin'= 4*(1:5))
    
    # Independent vars
    var_list = c("target_37", "target_38", "target_39") 
    
    for(var in var_list){
      print(df[[var]])  # Do whatever it was you wanted with your df
      lm(df[[var]] ~ kelvin, df) 
    }
    

    我的回答是一种猜测,因为您没有完全提供足够的代码来确切地知道您为什么会陷入精神困境。尽管我的回答是使用 for 循环,但我也强烈建议您采纳 MrFlick 对未来脚本的建议。 R 的函数式方法如果非常强大并且 for 循环会变得非常笨拙/不可读,非常快。

    【讨论】:

      【解决方案3】:

      您正在使 targetX 成为变量,是的,但您并没有使其成为数据表的一部分。您必须将其加入该表才能进行通话。像

      df$target_37 <- 'target_37'
      

      会的。

      【讨论】:

      • 我明白你想说什么,但这并不能解决 OP 遇到的问题
      • 哦?似乎应该。没有错误消息或示例数据,所以我不明白你怎么能说它没有。无论哪种方式,我都不认为这值得一票否决...
      • 我没有投反对票。在您的回答中,您建议在字符串 "target_37" 上回归 df$kelvin(包含数字数据)。您不能对 string 上的某些数值进行回归。问题中的问题是,需要告知R 不知何故不要将target_37 解释为字符串,而是作为包含数字数据的列df$target_37
      • 作为记录,我没有提出任何关于回归的建议:问题(现在已修改以删除相关部分)询问如何将文本“target_37”分配给变量名。我回答得很准确。
      • 不,你没有。他要lm(target_37 ~ kelvin, df),你要给他lm("target_37" ~ kelvin, df),这完全不同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多