dplyr:年末和开始年份之间的价值差异

时间:2016-04-20 07:15:16

标签: r dplyr

使用此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

如果数据从长格式转换为宽格式,可以通过从结束年份列(2006)中减去开始年份列(2003)来完成。

但是,我想使用dplyr并且不将数据转换为宽格式。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:5)

我们按照&#39; siteID&#39;,&#39;参数&#39;进行分组,并获得&#39;值&#39;之间的差异。这相当于最大的年份&#39;最短的&#39;年&#39;。 which.maxwhich.min会返回&#39;年份&#39;的最大/最小值的行索引。

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