管理一列中的重复条目,同时保持r中的其他列完整

问题描述 投票:1回答:2

我有多个站点的物种数据,包括站点,年,月和日的信息。在这些数据中,对于几个物种,某些日子有多个条目。例如,2016年1月3日,对于物种A1,有两个条目,即10和20.第一步,我想取这一天的最大值,即20.在第二步,如果有多个每个网站每月采样一天,然后我想采取每月的平均值。实例如下

species site    year    month   day total
A1  GG  2016    1   3   10
A1  GG  2016    1   3   20
A1  GG  2016    1   4   22
A2  GG  2016    1   5   32
A2  GG  2016    1   6   34
A3  GG  2016    1   9   23

应该看起来像这样的东西

species site    year    month   day total
A1  GG  2016    1   3.5 21
A2  GG  2016    1   5.5 33
A3  GG  2016    1   9   23
r dplyr aggregate plyr melt
2个回答
0
投票

我们按前五列分组,即'物种','地点','年','月','日',summarise得到'总'的max,然后分组没有'天'并获得mean 'day'和'total'

library(dplyr)
df1 %>%
    group_by_at(names(.)[1:5]) %>% 
    summarise(total = max(total)) %>%
    group_by_at(names(.)[1:4]) %>%
    summarise_all(mean)
# A tibble: 3 x 6
# Groups: species, site, year [?]
#   species site   year month   day total
#   <chr>   <chr> <int> <int> <dbl> <dbl>
#1 A1      GG     2016     1  3.50  21.0
#2 A2      GG     2016     1  5.50  33.0
#3 A3      GG     2016     1  9.00  23.0

1
投票

作为参考,这是使用data.table的解决方案

> library(data.table)
> dt <- fread("
  species site    year    month   day total
  A1  GG  2016    1   3   10
  A1  GG  2016    1   3   20
  A1  GG  2016    1   4   22
  A2  GG  2016    1   5   32
  A2  GG  2016    1   6   34
  A3  GG  2016    1   9   23
  ")
> cols_with_day <- c('species', 'site', 'year', 'month', 'day')
> cols_without_day <- c('species', 'site', 'year', 'month')
> result <- dt[, .(total = max(total)), by = cols_with_day
               ][, .(day = mean(day), total = mean(total)), by = cols_without_day]
> result
   species site year month day total
1:      A1   GG 2016     1 3.5    21
2:      A2   GG 2016     1 5.5    33
3:      A3   GG 2016     1 9.0    23
© www.soinside.com 2019 - 2024. All rights reserved.