【问题标题】:summing rows by combining levels R通过组合级别 R 对行求和
【发布时间】:2020-04-06 18:44:39
【问题描述】:

我想问你一个关于这个数据框的挑战。我不知道如何通过结合两个级别的“年份因子”来汇总()行。找到我的 df 模型。

placette year                   SP1               SP2  ... SPX
1         1 2013                 43                 4      ...
2         2 2013                 30                 0      ...
3         3 2013                 23                 3      ... 
4         1 2014                  0                 0      ...
5         2 2014                  2                 2      ...  
6         3 2014                  5                 0
7         1 2015                 16                 3
8         2 2015                 16                 1
9         3 2015                 20                 0
10        1 2016                 54                 4
11        2 2016                 51                 2
12        3 2016                 51                 0
 

我需要按周期将变量 SP1、SP2 的值与 SPX 相加。比如2年(2013+2014)和3年(2013+2014+2015)……

我会期待这个:

placette period                 SP1               SP2    ... SPX
1         1 2(2013+2014)         43                 4    ... ...
2         1 3(13+14+15)          59                 7    ... ...
3         1 4 (13+14+15+16)     113                11    ... ...
4         2 2 (13+14)            32                 2    ... ...
5         ... ... ...            ...              ...    ... ...

保持我的因素“网站”。

我正在研究 R,我想解决它。

非常感谢您对我的帮助。

问候, 托马斯。

【问题讨论】:

  • 你能显示预期的输出吗
  • 我编辑了我的问题
  • 很抱歉。事实上,我需要对我的数据框的一部分求和。我的因素是相同的(地点,年份)和对应的物种发生(df [,3:100])。我找到了如何计算我的行的总和,按站点将年份组合成周期。

标签: r variables sum aggregate levels


【解决方案1】:

使用dplyr,我们arrange by 'placette','year',按'placette'分组,得到名称为starts_with'SP'的变量的cumsum

library(dplyr)
data %>% 
   arrange(placette, year) %>%
   group_by(placette) %>% 
   mutate_at(vars(starts_with("SP")), cumsum)
# A tibble: 12 x 4
# Groups:   placette [3]
#  placette  year   SP1   SP2
#      <int> <int> <int> <int>
# 1        1  2013    43     4
# 2        1  2014    43     4
# 3        1  2015    59     7
# 4        1  2016   113    11
# 5        2  2013    30     0
# 6        2  2014    32     2
# 7        2  2015    48     3
# 8        2  2016    99     5
# 9        3  2013    23     3
#10        3  2014    28     3
#11        3  2015    48     3
#12        3  2016    99     3

数据

data <- structure(list(placette = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L), year = c(2013L, 2013L, 2013L, 2014L, 2014L, 2014L, 
2015L, 2015L, 2015L, 2016L, 2016L, 2016L), SP1 = c(43L, 30L, 
23L, 0L, 2L, 5L, 16L, 16L, 20L, 54L, 51L, 51L), SP2 = c(4L, 0L, 
3L, 0L, 2L, 0L, 3L, 1L, 0L, 4L, 2L, 0L)), class = "data.frame",
row.names = c(NA, 
-12L))

【讨论】:

  • 在这种情况下,您可以真正看到dplyr 在某些方面比data.table 更优雅。
  • @IanCampbell 我认为在你的data.table 中,它可以变得更紧凑
【解决方案2】:

这是一种使用 data.table 的方法。

library(data.table)
setDT(data)[order(year),][,
      lapply(.SD,cumsum),
      by="placette",
      .SDcols = setdiff(names(data),c("placette","year"))][
        ,N.Years := 1:.N,by="placette"][]
#    placette N.Years SP1 SP2
# 1:        1       1  43   4
# 2:        1       2  43   4
# 3:        1       3  59   7
# 4:        1       4 113  11
# 5:        2       1  30   0
# 6:        2       2  32   2
# 7:        2       3  48   3
# 8:        2       4  99   5
# 9:        3       1  23   3
#10:        3       2  28   3
#11:        3       3  48   3
#12:        3       4  99   3

数据

data <- structure(list(placette = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L), year = c(2013L, 2013L, 2013L, 2014L, 2014L, 2014L, 
2015L, 2015L, 2015L, 2016L, 2016L, 2016L), SP1 = c(43L, 30L, 
23L, 0L, 2L, 5L, 16L, 16L, 20L, 54L, 51L, 51L), SP2 = c(4L, 0L, 
3L, 0L, 2L, 0L, 3L, 1L, 0L, 4L, 2L, 0L)), class = "data.frame", row.names = c(NA, 
-12L))

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多