我的示例数据如下所示:
data <- read.table(text="group; year; val
a; 1928; 20
a; 1929; 50
a; 1930; 40
a; 1931; 45
b; 1935; -10
b; 1936; -15 ", sep=";", header=T, stringsAsFactors = FALSE)
> data
group year val
1 a 1928 20
2 a 1929 50
3 a 1930 40
4 a 1931 45
5 b 1935 -10
6 b 1936 -15
我想要做的是在新列sum_rel
中计算相对于1930年的累积和(例如,1930年是开始年份,应该添加1930年以上的所有值,并且应减去1930年以下的值)。如果所有年份都大于1930年,则相对值(0 =)应为每组最低年份(如案例b)。
group year val sum_rel
a 1927 -110
a 1928 20 -90
a 1929 50 -40
a 1930 40 0
a 1931 45 45
b 1934 0
b 1935 -10 -10
b 1936 -15 -25
我查看了cumsum
功能,但无法将其应用于群组,如果您能帮助我,我将非常高兴。
答案 0 :(得分:1)
添加额外的行可能是最棘手的部分。这似乎产生了你之后的输出
do.call("rbind", unname(lapply(split(data, data$group), function(x) {
x<-x[order(x$year),]
cx <- c(which(x$year==1930),0)[1]+1
cs <- cumsum(c(0, x$val))
cbind(rbind(transform(x[1,], val=NA, year=min(x$year)-1), x), sum_rel=cs-cs[cx])
})))
# group year val sum_rel
# 1 a 1927 NA -110
# 2 a 1928 20 -90
# 3 a 1929 50 -40
# 4 a 1930 40 0
# 5 a 1931 45 45
# 52 b 1934 NA 0
# 51 b 1935 -10 -10
# 6 b 1936 -15 -25