使用此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而不将数据转换为宽格式。

任何建议,将不胜感激。

最佳答案

我们按“ siteID”,“ parameter”分组,并获得“ value”(对应于最大值“ YEAR”和最小值“ YEAR”)之间的差。 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

07-27 21:29