dplyr:结束年份和起始年份之间的数值差异

4
使用这个data.frame
siteID <- c(rep("site1", 16), rep("site2", 16), rep("site3", 16),rep("site4", 16))
YEAR <-   rep(c("2003", "2004", "2005", "2006"), 16)
parameter <- c(rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4),
               rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4),
               rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4),
               rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4))
value <- c(seq(1, 4, by=1), seq(10, 40, by=10), seq(12, 18, by=2), seq(5, 20, by=5),
           seq(3, 12, by=3), sample(13:18, 4), sample(15:22, 4), sample(10:18, 4),
           seq(7, 1, by=-2), sample(15:22, 4), sample(15:19, 4), sample(10:20, 4),
           seq(8, 5, by=-1), seq(50, 20, by=-10), seq(16, 10, by=-2), seq(20, 5, by=-5))
df <- data.frame(siteID, parameter, YEAR, value)

head(df, 20)
> head(df, 20)
   siteID parameter YEAR value
1   site1         A 2003     1
2   site1         A 2004     2
3   site1         A 2005     3
4   site1         A 2006     4
5   site1         B 2003    10
6   site1         B 2004    20
7   site1         B 2005    30
8   site1         B 2006    40
9   site1         C 2003    12
10  site1         C 2004    14
11  site1         C 2005    16
12  site1         C 2006    18
13  site1         D 2003     5
14  site1         D 2004    10
15  site1         D 2005    15
16  site1         D 2006    20
17  site2         A 2003     3
18  site2         A 2004     6
19  site2         A 2005     9
20  site2         A 2006    12

我希望获得每个参数在结束年份和开始年份之间的差异值。

结果将如下所示:

siteID parameter difference
site1         A      3
site1         B      30
site1         C      6
site1         D      15

如果数据已从长格式转换为宽格式,可以通过减去开始年份列(2003)和结束年份列(2006)来完成。
然而,我想使用 dplyr 完成此操作,而不需要将数据转换为宽格式。
欢迎提出任何建议。
1个回答

5
我们按照'siteID'、'parameter'进行分组,并获取与最大'YEAR'和最小'YEAR'对应的'value'之间的差值。函数which.maxwhich.min返回'YEAR'的最大/最小值所在的行索引。
res <- df %>%
         group_by(siteID, parameter) %>%
         summarise(difference = value[which.max(YEAR)]-value[which.min(YEAR)])
head(res, 4)
#  siteID parameter difference
#  (fctr)    (fctr)      (dbl)
#1  site1         A          3
#2  site1         B         30
#3  site1         C          6
#4  site1         D         15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接