R сумма двух столбцов с условием третьего столбца - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть фрейм данных как:

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

Я хочу суммировать session_time_min и task_completed с предыдущей строкой, если timediff = 1

Хотите вывод как:

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 голосов
/ 12 ноября 2018

Создайте счетчик группы, используя 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
0 голосов
/ 12 ноября 2018

Вы можете использовать цикл 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. Если это NA, он добавляет (для 2 столбцов, которые вы хотите расположить в 3 и 4) в строку ниже (которая будет i+1)

...