计算相对累积和
问题描述:
我的样本数据是这样的:计算相对累积和
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
功能,但无法弄清楚过度组适用于它,我会很高兴,如果你能帮助我。
答
添加额外的行可能是最棘手的部分。这似乎产生输出你是后
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
我不能1930了解重复计算的价值逻辑正和1930年负和扩展这样的区域。这个专栏应该是什么解释?你可以使用'ave'或'split'对cumsum进行申请,但是你想要做的更加不寻常。 – MrFlick 2014-12-07 05:50:29
@MrFlick。抱歉,我手工创建的'解决方案'确实包含错误的值。请看看我的编辑,这是否更清楚? – nebuloso 2014-12-07 06:14:33
是的,这有点清晰。 – MrFlick 2014-12-07 06:32:38