代码之家  ›  专栏  ›  技术社区  ›  Jordan

使用dplyr循环聚合

  •  1
  • Jordan  · 技术社区  · 6 年前

    所以我试图找到这个可能很明显的问题的答案。我需要循环使用多个预测变量,以便获得每个预测值的另一列的摘要。这个数据帧将随着每次迭代而变化,因此我需要适用于多个不同数据帧的代码。以下是我迄今为止看过的地方:

    R- producing a summary calculation for each column that is dependent on aggregations at a factor level

    Multiple data frame handling

    使用mtcars软件包,我尝试了以下内容:

    #get mtcars data from graphics package
    install.packages("graphics")
    library(graphics)
    data <- mtcars 
    
    #loop through names
    variable <- list(colnames(data))
    for(i in variable){
    data1 <- data %>%
      group_by(i)
      summarise('number' = mean(mpg))
      }
    

    但是,我得到以下错误:

     Error in grouped_df_impl(data, unname(vars), drop) : 
     Column `i` is unknown
    

    不知道下一步要去哪里。

    1 回复  |  直到 6 年前
        1
  •  2
  •   akrun    6 年前

    代码中存在多个问题,

    1) the variable 不必要地创建为 list

    2) 循环通过“变量”不会进入 列表 ,这是1的问题。

    3) group_by_at 可用于代替 group_by 对于 string 输入

    4) 有一个无连接的输入错误,即链( %>% )之间 分组依据 summarise

    5) 输出应存储在 列表 否则,当我们分配给同一对象“data1”时,它将被覆盖


    以下代码进行更正

    variable <- colnames(data) #is a `vector` now
    data1 <- list() # initialize as a `list`
    for(i in variable){ 
     data1[[i]] <- data %>%
         group_by_at(i) %>% #changed to `group_by_at`
       summarise(number = mean(mpg))
     } 
    

    或者可以在 tidyverse 将以 列表 属于 tibble 并避免初始化 列表 和转让

    purrr::map(variable, ~ data %>%
                              group_by_at(.x) %>%
                              summarise(number = mean(mpg))) 
    

    如果我们需要绑定 列表 元素使用 bind_rows . 但是,它也会创建多个列,因为第一个列名不同,并用 NA

    purrr::map(variable, ~ data %>%
                          group_by_at(.x) %>%
                          summarise(number = mean(mpg))) %>%
                          set_names(variable) %>%
                          bind_rows(., .id = 'variable')