【问题标题】:R: Recalling variables dynamically within loopR:在循环内动态调用变量
【发布时间】:2019-04-19 23:54:44
【问题描述】:

我需要调用循环中的变量并将其用作我的列名:

这是一个示例数据集:

mtcars.df <- mtcars

预期输出:

mtcars.df <- mtcars.df %>% add_column(a1 = sample (1:4, 32, replace = TRUE), b1 = sample (1:4, 32, replace = TRUE), c1 = sample (1:4, 32, replace = TRUE))

所以需要在循环中创建 a1、b1 和 c1 并重命名为 a1、b1 和 c1。原始数据集中的名称更长(并且组合不同),但这是在变量 mpg.filename 中定义的。

这是我到目前为止所尝试的:第一个显然没有给出想要的结果,但它只是为了展示我想要实现的目标。

mpg.filename <- c("a1.file", "b1.file", "c1.file")
for (i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df$i <- sample (1:4, 32, replace = TRUE)
}

for (i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df$temp.var <- sample (1:4, 32, replace = TRUE)
  temp.name <- paste0 (sample.name) %>% rlang::parse_expr()
  mtcars.df <- mtcars.df %>% rename (eval (sample.name) = temp.var)
}

for (i in mpg.filename) {
  sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
  mtcars.df$temp.var <- sample (1:4, 32, replace = TRUE)
  temp.name <- paste0 (sample.name) %>% rlang::parse_expr()
  mtcars.df <- mtcars.df %>% rename (syms(sample.name) = temp.var)
}

我也试过getas.symbolparse (text = "sample.name"),但也没有用。

感谢您的帮助。我曾尝试在论坛上查看其他答案,但它们似乎不适用或不起作用。

using eval() on string to access object attributes in R

call columns from inside a for loop in R

Getting strings recognized as variable names in R

How to evaluate an expression with variables in R?

【问题讨论】:

    标签: r loops environment-variables


    【解决方案1】:

    您的第一次尝试很接近!当您想使用字符访问/创建 data.frame 中的列时,您需要使用 [[ 而不是 $。如果您只需要这样做,就不需要符号/解析/其他复杂的废话。

    for(i in mpg.filename) {
      sample.name <- unlist(strsplit(as.character(i), '.', fixed = TRUE))[1]
      mtcars.df[[sample.name]] <- sample(1:4, 32, replace=TRUE)
    }
    

    【讨论】:

      【解决方案2】:

      让我知道这是否成功 -

      mpg.filename <- c("a1.file", "b1.file", "c1.file")
      for (i in 1:length(mpg.filename)) {
        sample.name <- unlist(strsplit(as.character(mpg.filename[i]), '.', fixed = TRUE))[1]
        mtcars.df$i <- sample (1:4, 32, replace = TRUE)
        colnames(mtcars.df)[length(mtcars.df)]<-paste(sample.name)
      }
      

      【讨论】:

      • 我的原始代码和变量mpg.filename 被导入为list.files (),然后我正在读取由i 确定的文件。我没有在原始问题中指出这一点。我很抱歉。您的答案确实有效,但是当mpg.filename 被导入为list.files () 然后我尝试将其作为循环中的文件读取时,它会引发错误,因为i 现在是整数并且无法读取文件。不过,这是一个很好的解决方案。
      • 不确定我是否理解准确,但要从 i 转到列表中的项目,请使用:mpg.filename[i]
      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多