我有一个数据框列表:
df1 <- data.frame(one = c('red','blue','green','red','red','blue','green','green'),
                  one.1 = as.numeric(c('1','1','0','1','1','0','0','0')))
df2 <- data.frame(two = c('red','yellow','green','yellow','green','blue','blue','red'),
                  two.2 = as.numeric(c('0','1','1','0','0','0','1','1')))
df3 <- data.frame(three = c('yellow','yellow','green','green','green','white','blue','white'),
                  three.3 = as.numeric(c('1','0','0','1','1','0','0','1')))
all <- list(df1,df2,df3)
我需要按第一列对每个数据框进行分组并总结第二列。就我个人而言,我会做这样的事情:
library(dplyr)
df1 <- df1 %>%
  group_by(one) %>%
  summarise(sum = sum(one.1))
但是,我无法弄清楚如何迭代列表中的每个项目。
我想过使用循环:
for(i in 1:3){
      all[i] <- all[i] %>%
      group_by_at(1) %>%
      summarise()
}
但我不知道如何在 summarise() 函数中指定要求和的列(无论如何,这个循环在其他方面可能是错误的)。
理想情况下,我需要输出是另一个列表,其中每个项目都是汇总数据,如下所示:
[[1]]
# A tibble: 3 x 2
  one     sum
  <fct> <dbl>
1 blue      1
2 green     0
3 red       3
[[2]]
# A tibble: 4 x 2
  two      sum
  <fct>  <dbl>
1 blue       1
2 green      1
3 red        1
4 yellow     1
[[3]]
# A tibble: 4 x 2
  three    sum
  <fct>  <dbl>
1 blue       0
2 green      2
3 white      1
4 yellow     1
非常感谢任何帮助!
使用purrr::map和总结列包含一个\\.使用matches帮助器的字母点。
library(dplyr)
library(purrr)
map(all, ~.x %>%
    #group_by_at(vars(matches('one$|two$|three$'))) %>% #column ends with one, two, or three
    group_by_at(1) %>%
    summarise_at(vars(matches('\\.')),sum))
    #summarise_at(vars(matches('\\.')),list(sum=~sum))) #2nd option
[[1]]
# A tibble: 3 x 2
one   one.1
<fct> <dbl>
1 blue      1
2 green     0
3 red       3
[[2]]
# A tibble: 4 x 2
two    two.2
<fct>  <dbl>
1 blue       1
2 green      1
3 red        1
4 yellow     1
[[3]]
# A tibble: 4 x 2
three  three.3
<fct>    <dbl>
1 blue         0
2 green        2
3 white        1
4 yellow       1