使用此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
并且不将数据转换为宽格式。
任何建议都将不胜感激。
答案 0 :(得分:5)
我们按照&#39; siteID&#39;,&#39;参数&#39;进行分组,并获得&#39;值&#39;之间的差异。这相当于最大的年份&#39;最短的&#39;年&#39;。 which.max
和which.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