2015-08-19 51 views
1

我想創建一個等於數據$ Rating的運行總和的列,給出兩個條件在第3列和第4列中爲真,特別是數據$ Year <當前年份和數據$ ID等於當前ID。在R中爲數據框中的每一行計算一個條件運行總和

換句話說,這應該計算每個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中很好地解決了我的問題),所以如果語言不精確,請致歉。

+1

一個ID可以有兩排,同年進入?如果沒有,你可以試試'library(dplyr); df%>%group_by(ID)%>%排列(年)%>%mutate(cumSum = cumsum(Rating) - Rating)' –

+0

有一個ID可以在同一年出現多次 – user3725021

+2

所以請改進您的示例數據集/所需輸出 –

回答

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 
相關問題