我想创建一个等于数据$ Rating的运行总和的列,给定两个条件在第3列和第4列中为真,特别是数据$ Year<当前年份和数据$ ID等于当前ID。
在文字中,这应该计算每个id到上一年的累积评级总和。它应该为数据框中的每一行(大约50,000行)执行此操作。鉴于数据框的大小,如果可能的话,我不想循环。
我提供了一个简短的例子,说明下面的内容......
> head(data[,c(3,4,13)])
Year ID Rating CumSum
1 2010 13578 2 0
2 2010 13579 1 0
3 2010 13575 3 0
4 2011 13575 4 3
5 2012 13578 3 2
6 2012 13579 2 1
7 2012 13579 4 1
我来自电子表格背景,所以我仍然在考虑SUMIFS等等(这很好地解决了我在Excel中的问题),所以如果语言不准确就道歉。
答案 0 :(得分:1)
data <- data.frame(Year = c( rep(2010, 3), 2011, rep(2012, 3) ),
ID = c(13578, 13579, 13575, 13575, 13578, 13579, 13579),
Rating = c(2, 1, 3, 4, 3, 2, 4))
data
# Year ID Rating
# 1 2010 13578 2
# 2 2010 13579 1
# 3 2010 13575 3
# 4 2011 13575 4
# 5 2012 13578 3
# 6 2012 13579 2
# 7 2012 13579 4
data$Rating
的运行总和的列
data$Year < Year
data$ID == ID
ID
到上一年的评级累积总和所需的输出是
data
# Year ID Rating CumSum
# 1 2010 13578 2 2
# 2 2010 13579 1 1
# 3 2010 13575 3 3
# 4 2011 13575 4 7
# 5 2012 13578 3 5
# 6 2012 13579 2 3
# 7 2012 13579 4 7
这可以这样做
year <- 2014 # maximum year to include in cumsum
ID.values <- names(table(data$ID)) # get unique values of data$ID, sorted
# cumsum for 13575 rows, followed by cumsum for 13578 rows, ...
Rating.cumsum <- unlist(sapply(ID.values,
function(x) cumsum(data$Rating[data$ID == x])))
# assign cumsum output to appropriate rows
data$cumsum[with(data, order(ID))] <- Rating.cumsum