【问题标题】:Get Frequency using a loop in dplyr使用 dplyr 中的循环获取频率
【发布时间】:2019-04-07 00:44:40
【问题描述】:

我正在尝试使用循环和 dplyr 包为每个变量获取单独的频率表,我的代码示例如下使用 mtcars 数据:

library(dplyr)

var= c("vs", "am", "gear")

for (i in var){
mtcars %>%
group_by(carb) %>%
count(i)
}

可悲的是只有我得到:

Error: Column `i` is unknown

我也试过

for (i in var){
mtcars %>%
group_by(carb) %>%
summarise_each(funs(n()), i)
}

但没有成功, 请任何建议,我将不胜感激。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用!!sym() 作为变量名。我还建议将结果保存到如下列表中。

    var <- c("vs", "am", "gear")
    
    library(dplyr)
    
    count_tables <- list()
    
    for (i in var){
      temp <- mtcars %>%
        group_by(carb) %>%
        count(!!sym(i))
    
      count_tables[[i]] <- temp       
    }
    
    count_tables
    # $vs
    # # A tibble: 8 x 3
    # # Groups:   carb [6]
    #    carb    vs     n
    #   <dbl> <dbl> <int>
    # 1     1     1     7
    # 2     2     0     5
    # 3     2     1     5
    # 4     3     0     3
    # 5     4     0     8
    # 6     4     1     2
    # 7     6     0     1
    # 8     8     0     1
    # 
    # $am
    # # A tibble: 9 x 3
    # # Groups:   carb [6]
    #   carb    am     n
    #   <dbl> <dbl> <int>
    # 1     1     0     3
    # 2     1     1     4
    # 3     2     0     6
    # 4     2     1     4
    # 5     3     0     3
    # 6     4     0     7
    # 7     4     1     3
    # 8     6     1     1
    # 9     8     1     1
    # 
    # $gear
    # # A tibble: 11 x 3
    # # Groups:   carb [6]
    #     carb  gear     n
    #    <dbl> <dbl> <int>
    #  1     1     3     3
    #  2     1     4     4
    #  3     2     3     4
    #  4     2     4     4
    #  5     2     5     2
    #  6     3     3     3
    #  7     4     3     5
    #  8     4     4     4
    #  9     4     5     1
    # 10     6     5     1
    # 11     8     5     1
    

    使用lapply 循环遍历向量或列表以应用函数并将对象作为列表返回也很常见。以下生成与 for 循环相同的输出。

    count_tables <- lapply(var, function(x) {
      mtcars %>%
        group_by(carb) %>%
        count(!!sym(i))
    })
    names(count_tables) <- var
    

    【讨论】:

      【解决方案2】:

      对于以编程方式将变量作为字符串传递,您可以使用那些末尾带有和下划线的函数的版本,例如count_group_by_ 等。

      在这种情况下,它将是:

      for (i in var){
        mtcars %>%
          group_by(carb) %>%
          count_(i) %>% 
          print()
      }
      

      您特别要求使用for 循环,但为了您的考虑,这里有一个lapply 替代方案,它可以更轻松地将不同的结果存储在一个位置以供以后访问:

      lapply(var, FUN = function(i) mtcars %>% group_by(carb) %>% count_(i))
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2022-08-10
      相关资源
      最近更新 更多