В наборе данных, в котором у меня есть активность, время начала и окончания, а также идентификатор, я хочу объединить значения двух строк в одном столбце и обновить другие столбцы, если применяются несколько условий. Сначала пример данных:
library(data.table)
DT <- data.table(person=c(1,1,1,1,2,2,2,2,2,3,3,3,3),
activity=c("grab", "walk", "remove", "delete", "run", "talk", "walk", "remove",
"grab", "walk", "delete", "talk", "remove"),
start_time=c(0,1,3,6,0,2,2,3,3,3,6,6,7), stop_time=c(1,3,5,7,1,4,4,8,4,5,7,7,8))
DT
Я хочу обновить время начала и окончания и объединить столбец «активность» для каждого человека, если:
- действия выполняются параллельно. В частности, если start_time следующего действия предшествует stop_time предыдущего действия действия для этого человека. Или:
- Если время начала или окончания действий одного человека идентично.
Обновленная строка должна отражать время начала и окончания объединенной операции и все строкикроме того, что обновленный должен быть удален. Ниже приведена цель, которую я хочу достичь с помощью предоставленного мной образца данных:
DT.goal <- data.table(person=c(1,1,2,2,3,3),
activity=c("grab + walk + remove", "delete", "run", "talk + walk + grab + remove",
"walk", "delete + talk + remove"),
start_time=c(0,6,0,2,3,6), stop_time=c(5,7,1,8,5,8))
DT.goal
До сих пор я придумал следующую незавершенную попытку:
DT.test <- DT[start_time <= shift(stop_time, 1L, type="lag"),
cond := T, by=person]
DT.test <- DT.test[cond==T,
new_activity := paste(activity, shift(activity, 1L, type="lag")), by=person]
DT.test <- DT.test[, new_start := start_time, by=person][cond==T, new_start := min(start_time), by=person]
DT.test <- DT.test[, new_stop := stop_time, by=person][cond==T, new_stop := max(stop_time), by=person]
Однако, используяshift(, type="lag)
не очень полезен для первого ряда для каждого человека, так как теперь у него есть предыдущий ряд для просмотра. Кроме того, paste()
вставляет NA, если условие не оценивается как TRUE
.
Может кто-нибудь помочь мне на моем пути?