基于另一列的值,仅聚合特定行

3

我有这个数据集

  CASHPOINT_ID         DT     status   QT_REC
1   N053360330 2016-01-01 end_of_day      5
2   N053360330 2016-01-01 end_of_day      2
3   N053360330 2016-01-02 before          9
4   N053360330 2016-01-02 before         NA
5   N053360330 2016-01-03 end_of_day     16
6   N053360330 2016-01-03 end_of_day     NA

我希望聚合仅不具有状态标记为"before"的行,并保持其他行不受影响。生成的数据集应如下所示:
 CASHPOINT_ID         DT     status       QT_REC
    1   N053360330 2016-01-01 end_of_day      7
    3   N053360330 2016-01-02 before          9
    4   N053360330 2016-01-02 before         NA
    5   N053360330 2016-01-03 end_of_day     16

谢谢。
3个回答

2

使用 data.table

假设您的原始数据称为dt并已经进行了setDT(),那么您可以执行以下操作:

df <- rbind(
  dt[status == "end_of_day", .(QT_REC = sum(QT_REC, na.rm = TRUE)), 
     by = .(CASHPOINT_ID, DT, status)],
  dt[status != "end_of_day"]
)[order(DT)]

print(df)
   CASHPOINT_ID         DT     status QT_REC
1:   N053360330 2016-01-01 end_of_day      7
2:   N053360330 2016-01-02     before      9
3:   N053360330 2016-01-02     before     NA
4:   N053360330 2016-01-03 end_of_day     16

0

这是使用dplyr的解决方案。

    library(dplyr)
    df %>%  
          group_by(floor_date(DT, "day"),status) %>% 
          summarise(QT_REC = sum(QT_REC, na.rm = T))

1
什么是 floor_date() 函数? - s_baldur
这是来自lubridate包的函数。 我使用它是因为,如果精确到秒,我将无法按日期进行分组。所使用的单位是day - Megha John
也许在这里更容易的方法是将其视为一个字符? - s_baldur

0

另一种基于plyr的解决方案:

ddply(.data = df,.variables = c('CASHPOINT_ID','DT','status'),
function(t){
    if(t$status[1]!='before'){
        unique(mutate(t,QT_REC=sum(QT_REC,na.rm=TRUE)))
    }else{
        t
    }
})

#  CASHPOINT_ID          DT     status QT_REC
#1   N053360330  2016-01-01 end_of_day      7
#2   N053360330  2016-01-02     before      9
#3   N053360330  2016-01-02     before     NA
#4   N053360330  2016-01-03 end_of_day     16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接