【问题标题】:variable names in for loopfor循环中的变量名
【发布时间】:2019-11-19 05:39:11
【问题描述】:
x_names <-c("x1","x2","x3")
data <- c(1,2,3,4)
fake <- c(2,3,4,5)

for (i in x_names)
{
  x = fake
  data = as.data.frame(cbind(data,x))  
  #data <- data %>% rename(x_names = x) 
}

我做了一个玩具例子。此代码将生成一个数据框,其中 1 列称为数据,3 列称为 x。我不想调用列 x,而是希望它们的名称为 x1、x2、x3(存储在 x_names 中)。我将 x_name 放在代码中(注释掉),但它不起作用。你能帮我解决一下吗?

【问题讨论】:

  • 这里发生了几件事。首先,我会为每一列使用名称以减少混乱。那么您可以使用rlang::sym 来评估表达式。然而,最快的解决方法是在循环之后添加colnames(data) = c("data","x1","x2","x3")
  • 这是一个过于简单的例子。我无法在循环之后执行此操作,因为我正在循环中进行一些建模工作,并且它不适用于具有相同列名的列。

标签: r for-loop


【解决方案1】:

当你交换你的 out-comment 行时

#data <- data %>% rename(x_names = x)

colnames(data)[ncol(data)]  <- i

它应该设置正确的列名。

【讨论】:

    【解决方案2】:

    一个选项只是分配“假”以在base R中创建新列

    data[x_names] <- fake
    data
    #  data x1 x2 x3
    #1    1  2  2  2
    #2    2  3  3  3
    #3    3  4  4  4
    #4    4  5  5  5
    

    编辑:基于来自 @avid_user 的 cmets

    数据

    data <- data.frame(data)
    

    【讨论】:

      【解决方案3】:

      我们可以避免for循环,使用replicate重复fake数据,使用setNames命名数据框x_names

      cbind(data, setNames(data.frame(replicate(length(x_names), fake)), x_names))
      
      #  data x1 x2 x3
      #1    1  2  2  2
      #2    2  3  3  3
      #3    3  4  4  4
      #4    4  5  5  5
      

      理想情况下,应该避免在循环中增长对象,但是解决 OP 在循环中的问题的一种方法是

      for (i in seq_along(x_names)) {
          data = cbind.data.frame(data, fake)
          names(data)[i + 1] <- x_names[i]
      }
      

      【讨论】:

      • 这是一个过于简单的例子。循环中有一些建模工作,所以我无法避免使用它。
      • @user1481397 更新了答案,因此它可以循环运行。
      【解决方案4】:

      我们也可以从tidyverse使用map_dfc

      library(tidyverse)
      
      cbind(data, map_dfc(x_names, ~ tibble(!!.x := fake)))
      

      输出:

        data x1 x2 x3
      1    1  2  2  2
      2    2  3  3  3
      3    3  4  4  4
      4    4  5  5  5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多