R对两列求和,条件是第三列

时间:2018-11-11 22:53:19

标签: r sum sumifs

我有一个数据框,例如:

user_name started_at          session_time_min    task_completed timediff
ABC       2018-03-02 18:00:00                1                 3       NA
ABC       2018-03-02 19:00:00             1036                18        1
ABC       2018-03-03 12:00:00                6                10       17
ABC       2018-03-04 21:00:00                0                 1       33
ABC       2018-03-05 16:00:00              143                61       19
ABC       2018-03-05 18:00:00               12                18        2
ABC       2018-03-05 19:00:00               60                94        1
ABC       2018-03-05 20:00:00               20                46        1
ABC       2018-03-09 15:00:00                0                 1       91

如果timediff = 1,我想将session_time_min和task_completed与上一行相加

想要的输出:

user_name started_at          session_time_min    task_completed 
ABC       2018-03-02 18:00:00             1037                21       
ABC       2018-03-03 12:00:00                6                10       
ABC       2018-03-04 21:00:00                0                 1       
ABC       2018-03-05 16:00:00              143                61       
ABC       2018-03-05 18:00:00               92               158        
ABC       2018-03-09 15:00:00                0                 1       

任何帮助都会得到高度重视。

2 个答案:

答案 0 :(得分:1)

您可以使用for循环来帮助您,特别是如果您想使用基数R。

for (i in 1:nrow(data)) {
  if (is.na(data[i,5])){
    data[i+1,3] <- data[i+1,3] + data[i,3]
    data[i+1,4] <- data[i+1,4] + data[i,4]
  } else {}
}

data <-  na.omit(data)

此代码遍历数据帧的每一行,并检查第5列(timediff)中的值是否为NA。如果它是不适用,则将其添加(对于您希望位于3和4的2列)到下面的行(将为i+1

答案 1 :(得分:1)

使用cumsum创建一个组计数器,然后使用它来对标识符列和rowsum值列进行子集化:

grp <- cumsum(!dat$timediff %in% 1)
#[1] 1 1 2 3 4 5 5 5 6
cbind(
  dat[match(unique(grp), grp), c("user_name","started_at")],
  rowsum(dat[c("session_time_min","task_completed")], grp)
)
#  user_name         started_at session_time_min task_completed
#1       ABC 2018-03-0218:00:00             1037             21
#3       ABC 2018-03-0312:00:00                6             10
#4       ABC 2018-03-0421:00:00                0              1
#5       ABC 2018-03-0516:00:00              143             61
#6       ABC 2018-03-0518:00:00               92            158
#9       ABC 2018-03-0915:00:00                0              1