【问题标题】:Better way to summarize multiple groups in same dataframe在同一数据框中总结多个组的更好方法
【发布时间】:2020-09-20 05:39:52
【问题描述】:

我不确定是否有更好的方式来表达标题,这可能会妨碍我搜索答案。

我有一个如下所示的数据框:

example_df <- data.frame(
  ID = c('A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'),
  location = c('park 1', 'park 1', 'park 2', 'park 3', 'park 1', 'park 4', 'park 1', 'park 5'),
  sample_2000 = c(1, 5, 0, 2, 3, 1, 0, 8), 
  sample_2001 = c(2, 1, 1, 3, 5, 6, 4, 2), 
  sample_2003 = c(1, 2, 5, 8, 11, 1, 0, 7)
  )

  ID location sample_2000 sample_2001 sample_2003
1  A   park 1           1           2           1
2  A   park 1           5           1           2
3  A   park 2           0           1           5
4  B   park 3           2           3           8
5  B   park 1           3           5          11
6  C   park 4           1           6           1
7  C   park 1           0           4           0
8  C   park 5           8           2           7

我想按位置汇总每年的所有值,并最终在同一数据框中得到结果。我目前正在使用 group_by() 并单独总结每一年,然后将所有内容重新组合在一起:

library(dplyr)

summarize1 <- group_by(example_df, location) %>% dplyr::summarize(sample_2000 = sum(sample_2000))
summarize2 <- group_by(example_df, location) %>% dplyr::summarize(sample_2001 = sum(sample_2001))
summarize3 <- group_by(example_df, location) %>% dplyr::summarize(sample_2003 = sum(sample_2003))

all_summarized <- Reduce(function(x, y) merge(x, y, all=TRUE), list(summarize1, summarize2, summarize3))

所需的输出(我从上面收到)如下所示:


  location sample_2000 sample_2001 sample_2003
1   park 1           9          12          14
2   park 2           0           1           5
3   park 3           2           3           8
4   park 4           1           6           1
5   park 5           8           2           7

当然有更好的方法。我在 for 循环中的尝试返回以下内容:

'sum(paste0("sample_", i)) 中的错误: 参数的“类型”(字符)无效


year_list <- c(2000, 2001, 2003)

for (i in year_list) {

  test <- group_by(example_df, location) %>% dplyr::summarize(paste0("sample_", i)) = sum(paste0("sample_", i))

}

谢谢!

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    如果我们想对Reduce/merge使用类似的方法,那么我们可以从purrr使用map/reduce

    library(dplyr)
    library(purrr)
    map(names(example_df)[3:5], ~  
       example_df %>% 
            select(location, .x) %>%
            group_by(location) %>% 
            summarise_at(vars(starts_with('sample')), sum)) %>% 
       reduce(full_join)
    

    或者使用summarise/across(在dplyr的新版本中),我们可以获得相同的输出(虽然不确定该示例是针对一般情况还是仅与sum相关)

    example_df %>%
          group_by(location) %>% 
          summarise(across(starts_with('sample'), sum))
    

    或者使用来自dplyr 稳定版的summarise_at(将来可能会弃用)

    example_df %>%
        group_by(location) %>%
        summarise_at(vars(starts_with('sample')), sum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多