【问题标题】:Calculate a conditional running sum in R for every row in data frame为数据框中的每一行计算 R 中的条件运行总和
【发布时间】:2015-08-19 13:57:43
【问题描述】:

我想创建一个等于 data$Rating 的运行总和的列,假设第 3 列和第 4 列中的两个条件为真,特别是 data$Year

换句话说,这应该计算每个 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 中的问题),如果语言不准确,敬请见谅。

【问题讨论】:

  • 一个ID可以有两行相同的年份条目吗?如果没有,你可以试试library(dplyr); df %>% group_by(ID) %>% arrange(Year) %>% mutate(cumSum = cumsum(Rating) - Rating)
  • 是的,一个ID在同一年可以出现多次
  • 所以请改进您的示例数据集/所需的输出
  • 更新了示例以证明 ID 可以在一年内出现多次

标签: r


【解决方案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 &lt; 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

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2021-10-31
    • 2021-03-24
    相关资源
    最近更新 更多