R 在同一数据帧中汇总多个组的更好方法

R 在同一数据帧中汇总多个组的更好方法,r,dplyr,summarize,R,Dplyr,Summarize,我不确定用什么更好的方式来表达这个标题,这可能会妨碍我寻找答案 我有一个如下所示的数据帧: 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,

我不确定用什么更好的方式来表达这个标题,这可能会妨碍我寻找答案

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

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


  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循环时返回以下结果:

'总和中的错误(paste0(“样本_”,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))

}



年份列表如果我们想使用类似的方法来减少/合并
,那么我们可以使用
map/Reduce
from
purr

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)

或者使用
summary/cross
(在新版本的
dplyr
中),我们可以获得相同的输出(尽管不确定示例是否用于一般情况或仅与
sum
相关的内容)

或者使用稳定版本的
dplyr
(将来可能会被弃用)中的
summary\u

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)
example_df %>%
      group_by(location) %>% 
      summarise(across(starts_with('sample'), sum))
example_df %>%
    group_by(location) %>%
    summarise_at(vars(starts_with('sample')), sum)