我有以下格式的資料:
mydata <- data.frame(id=c(1,1,1,2,2,2,2),event=c(1,1,2,1,2,2,3), time=c(2,2,3,6,8,8,11))
mydata
id event time
1 1 1 2
2 1 1 2
3 1 2 3
4 2 1 6
5 2 2 8
6 2 2 8
7 2 3 11
我希望計算每個事件之間的時間,但我遇到了麻煩,因為有些事件有多個觀察結果。結果列應如下所示:
id event time event_dt
1 1 1 2 0
2 1 1 2 0
3 1 2 3 1
4 2 1 6 0
5 2 2 8 2
6 2 2 8 2
7 2 3 11 3
如果可能的話,我想使用 dplyr 來做到這一點。
uj5u.com熱心網友回復:
我添加了最短時間,以防您對給定事件進行多次(如果可能)。然后,您可以使用lag捕獲時間差,然后將其加入回原始資料幀。
library(tidyverse)
mydata %>%
dplyr::group_by(id, event) %>%
dplyr::mutate_at(vars("time"), min) %>%
dplyr::distinct() %>%
dplyr::ungroup(event) %>%
dplyr::mutate(event_dt = time - lag(time)) %>%
dplyr::left_join(., mydata, by = c("id", "event", "time")) %>%
tidyr::replace_na(., list(event_dt=0))
輸出
# A tibble: 7 × 4
# Groups: id [2]
id event time event_dt
<dbl> <dbl> <dbl> <dbl>
1 1 1 2 0
2 1 1 2 0
3 1 2 3 1
4 2 1 6 0
5 2 2 8 2
6 2 2 8 2
7 2 3 11 3
資料
mydata <- structure(list(
id = c(1, 1, 1, 2, 2, 2, 2),
event = c(1, 1, 2, 1, 2, 2, 3),
time = c(2, 2, 3, 6, 8, 8, 11)
),
class = "data.frame",
row.names = c(NA,-7L))
uj5u.com熱心網友回復:
計算每個獨特id/event/time組合的差異,然后將其合并:
mydata %>%
distinct(id, event, time) %>%
group_by(id) %>%
mutate(event_dt = c(0, diff(time))) %>%
right_join(mydata)
#Joining, by = c("id", "event", "time")
## A tibble: 7 x 4
## Groups: id [2]
# id event time event_dt
# <dbl> <dbl> <dbl> <dbl>
#1 1 1 2 0
#2 1 1 2 0
#3 1 2 3 1
#4 2 1 6 0
#5 2 2 8 2
#6 2 2 8 2
#7 2 3 11 3
uj5u.com熱心網友回復:
我想知道您是否可以嘗試使用map_dblfrom purrr?在這里,您可以取time給定的event并減去time對應的event - 1。那些沒有先前時間的人將從NA零轉換。這也假設事件編號是連續的,并且給定事件的時間相同。
library(tidyverse)
mydata %>%
group_by(id) %>%
mutate(event_dt = map_dbl(event, ~time[event == .x][1] - time[event == .x - 1][1])) %>%
replace_na(list(event_dt = 0))
輸出
id event time event_dt
<dbl> <dbl> <dbl> <dbl>
1 1 1 2 0
2 1 1 2 0
3 1 2 3 1
4 2 1 6 0
5 2 2 8 2
6 2 2 9 2
7 2 3 11 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383093.html
