【问题标题】:summarize original data based on expand grid categories根据扩展网格类别汇总原始数据
【发布时间】:2019-08-16 19:50:52
【问题描述】:

我想用 dplyr 总结一个表格。 以下是我想继续的方式:

  • 我有一个这样的 data.frame:
 year    region week  site           species    gps_clutch
2017    sud   18     6                  au        337
2017    sud   20     10                 au        352
2017    sud   22     10                 au        352
2017    sud   24     10                 au        352
2017    sud   18     6                  aio       337
2017    sud   20     6                  aio       352
2017    sud   22     6                  au        352
2018    sud   20     6                  au        337
2018    sud   20     10                 au        352
2018    sud   22     10                 au        352
2018    sud   22     10                 aio       352
2018    sud   22     6                  au        352
2017    nor   19     5                  au        337
2017    nor   21     2                  au        352
2017    nor   23     5                  au        352
2017    nor   25     2                  au        352
2017    nor   19     5                  aio       337
2017    nor   25     5                  aio       352
2017    nor   19     5                  au        337
2018    nor   21     2                  aio       352
2018    nor   23     5                  aio        352
2018    nor   25     2                  au        352
2018    nor   23     5                  aio       337
2018    nor   23     5                  au       352
  • 我想计算每年、地区、站点、周的“gps_clutch”数量,并将其扩展为每个地区记录的所有可能的周。我解释说:在“sud”区域中,我在第 18、20、22、24 周和“nor”区域中第 19、21、23、25 周进行了采样。我想将隐式缺失值转换为“0”,但仅限于已采样的周数(嵌套在区域中)。我不想以在“sud”地区第 19 周获得连续数据的方式进行扩展,因为该地区没有在该特定周进行抽样。

这段代码可以很好地扩展我想要的网格:

dat %>%
  group_by(region) %>%
  expand(year,site, species,week)

以下代码也可以工作,以获取计数值,但不会按照我的意愿扩展网格(我只得到我每年观察到的周数列表,而不是在两者中采样的总周数年)。这意味着如果在“sud”“2017”中我只有第 20 周和第 22 周的记录,则网格不会扩展到第 18 周和第 24 周:

field_subsetnord %>%
  group_by(year,region,site,species,week) %>%
  summarise(count_clutch=length(gps_clutch)) %>% 
  complete(week,nesting(year,sites,species), fill = list(count_clutch = 0))

这是我想在最后得到的表格:

 year    region week  site           species    count
2017     sud    18     6             au         1
2017     sud    20     6             au         0
2017     sud    22     6             au         1
2017     sud    24     6             au         0

2017     sud    18     6             aio        1
2017     sud    20     6             aio        1
2017     sud    22     6             aio        0
2017     sud    24     6             aio        0

2017     sud    18     10            au         0
2017     sud    20     10            au         1
2017     sud    22     10            au         1
2017     sud    24     10            au         1

2017     sud    18     10            aio        0
2017     sud    20     10            aio        0
2017     sud    22     10            aio        0
2017     sud    24     10            aio        0

2018     sud    18     6             au        0
2018     sud    20     6             au        1
2018     sud    22     6             au        1
2018     sud    24     6             au        0

2018     sud    18     6             aio       0
2018     sud    20     6             aio       0
2018     sud    22     6             aio       0 
2018     sud    24     6             aio       0

2018     sud    18     10            au        0
2018     sud    20     10            au        1
2018     sud    22     10            au        1
2018     sud    24     10            au        0

2018     sud    18     10            aio       0
2018     sud    20     10            aio       0
2018     sud    22     10            aio       1
2018     sud    24     10            aio       0

and so on for 2018...

任何混合这两个代码的建议将不胜感激:)

【问题讨论】:

  • 您可以指定week = 18:24 来指定应该扩展的值。从你得到的解释来看,我不完全确定这是否是你想要的。请以可重现的格式提供数据并包括所有样本(例如 18 代表 sud 不在您显示的数据中),从而使示例更具重现性
  • 我刚刚相应地编辑了我的问题

标签: r dplyr tidyr


【解决方案1】:

您的两种方法非常接近。从本质上讲,它们只需要结合起来就可以得到你想要的。 :)

先按区域分组,然后complete() 数据集,然后按所有变量和summarise() 重新分组。由于gps_clutch 现在将包含缺失值,因此您可以在summarise() 语句中汇总非缺失值(通过!is.na)来计算离合器。

dat %>%
    group_by(region) %>%
    complete(year, site, species, week) %>% 
    group_by(year, region, site, species, week) %>%
    summarise(count_clutch = sum( !is.na(gps_clutch) ) )

# A tibble: 64 x 6
# Groups:   year, region, site, species [16]
    year region  site species  week count_clutch
   <int> <fct>  <int> <fct>   <int>        <int>
 1  2017 nor        2 aio        19            0
 2  2017 nor        2 aio        21            0
 3  2017 nor        2 aio        23            0
 4  2017 nor        2 aio        25            0
 5  2017 nor        2 au         19            0
 6  2017 nor        2 au         21            1
 7  2017 nor        2 au         23            0
 8  2017 nor        2 au         25            1
 9  2017 nor        5 aio        19            1
10  2017 nor        5 aio        21            0
# ... with 54 more rows

【讨论】:

  • 确实!谢谢你的帮助。不过,我无法真正理解的是,我的脚本只有在我的变量通过“as.character”传递时才有效。如果它们是因素,它将不再起作用。是不是应该这样?
  • @user3016665 在某些情况下,因素肯定会导致困难。例如,有时它们会被转换为显示它们的索引(整数)而不是字符值。我上面展示的例子是使用“区域”和“物种”的因素,不过,它似乎工作正常(看起来我正在使用 dplyr 和 tidyr 的开发版本)。
  • 最后一个问题,如果我想同时获得 count_clutch (如示例中所示)每年>region>site>sites>week 和另一列将按组计数但在站点停止水平(它将对应于一周变量的总和)。我将如何继续将其包含在同一代码中。我应该添加另一个“group_by”来使这个不同的计数吗?
  • @user3016665 我不确定我是否理解,但summarise() 总是删除“最后一个”分组变量。因此,在我的回答中,在管道的末尾,除周之外的所有内容都将其分组(因为数据现在处于周级别)。如果您想添加一个变量来表示离合器的总周数,您可以执行类似%&gt;% mutate(nweek = sum( count_clutch != 0) ) 的操作。要在几周内汇总而不是添加汇总列,请使用 summarise()
猜你喜欢
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2023-03-23
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多