【问题标题】:R - How to use a variable created in a for loop as a column name in a data frame?R - 如何使用在 for 循环中创建的变量作为数据框中的列名?
【发布时间】:2021-03-20 15:09:29
【问题描述】:

我有 2 个问题; 在第一个 FOR 中,我创建了一个名为“column”的变量名,并且在每个循环中,我想将此列名用作分组变量。 在第二个 FOR 中,我想通过再次使用“列”变量为数据框变量分配一些值。假设在第一个循环中我想要“df$var1

# Dataset
df <- tibble(
  var1 = c(rep("a", 5), rep("b", 5)),
  var2 = c(rep("c", 3), rep("d", 7)),
  var3 = rnorm(10)
)

# First Loop
for(x in 1:2) {
  column <- paste0("var", x)
  df2 <- df %>% group_by(column) %>% summarize(total = n())
}

# Second Loop
for(x in 1:2) {
  column <- paste0("var", x)
  df$column <- 999
}

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    对于您的第一个问题,您可以将!!sym() 包裹在“column”周围,即!!sym(column) 会将“column”视为一个符号,并允许您在group_by 中调用变量名称。

    对于第二个问题,在为数据框列分配变量名称时,最好使用[ 而不是$。这将起作用,df[[column]]

    【讨论】:

    • !!sym() 和 [[..]] 都可以完美运行。非常感谢。
    【解决方案2】:

    我一开始不会将 tidyverse 与 for 循环混合使用。有可能,它可以很好地工作,但你在 base 和 tidyverse 中都有优雅的解决方案

    # Base:
    lapply(1:2, function(x) table(df[, x]))
    
     #It will return
    [[1]]
    a b 
    5 5 
    
    [[2]]
    c d 
    3 7 
    

    这是你可以使用的东西。 至于第二次手术,描述的很模糊。然而,我觉得你看起来像这样:

    #Base:
    for(x in 1:2) {
     df[, x] <- 999
    }
    
    #Returning
    > df
    # A tibble: 10 x 3
        var1  var2    var3
       <dbl> <dbl>   <dbl>
     1   999   999  1.01  
     2   999   999  1.01  
     3   999   999 -0.982 
     4   999   999  0.0672
     5   999   999  2.58  
     6   999   999  1.47  
     7   999   999  0.993 
     8   999   999  1.07  
     9   999   999  0.781 
    10   999   999 -1.15  
    

    这没有多大意义。如果您尝试分配不同的值。你可以这样做:

    #define values
    vars <- list(999, 1:10)
    
    for(i in 1:2) {
     df[, i] <- vars[[i]]
    }
    
    > df
    # A tibble: 10 x 3
        var1  var2   var3
       <dbl> <int>  <dbl>
     1   999     1 -0.115
     2   999     2  0.349
     3   999     3 -0.675
     4   999     4 -0.725
     5   999     5 -0.634
     6   999     6 -0.748
     7   999     7  2.71 
     8   999     8 -2.09 
     9   999     9  1.45 
    10   999    10  0.176
    

    这能回答你的问题吗?

    【讨论】:

    • 对于 lapply 的第一个答案;它适用于这个例子,但我试图使用我在分组时在 for 循环中创建的“列”变量。我想看看“group_by(column)”命令在每个循环中是如何工作的。对于我的第二个问题,我再次尝试使“列”变量与我的数据框一起使用。我的问题是在赋值时不能使用“df$column”。
    【解决方案3】:

    不确定您想要的最终输出是什么,但您可以尝试以下代码,如果需要,应该可以扩大规模:

    library(tidyverse)
    
    ##create simple count function
    count_col <- function(col){
      df %>% count(!!sym(col))
    }
    
    ## define your columns for counting
    cols <- names(df[1:2])
    ## map as a list
    map(cols,count_col)
    
    ## map as dataframe with separate columns
    map_dfc(cols,count_col)
    
    
    ## change all values in specified columns
    df[,cols] <- 999
    
    ## which is the same as
    df[,1:2] <- 999
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多