确定 R 中的事件时间
Determine time of event in R
想知道在 R 中确定事件时间的最有效方法是什么。其他答案似乎没有按 ID 分组,这是我需要的一大块。
我的数据是这样的:
time = rep(c(1:5),2)
id = c(rep(1,5),rep(2,5))
event = c(0,0,0,1,1,0,1,1,1,1)
df = data.frame(cbind(time,id,event))
df
time id event
1 1 1 0
2 2 1 0
3 3 1 0
4 4 1 1
5 5 1 1
6 1 2 0
7 2 2 1
8 3 2 1
9 4 2 1
10 5 2 1
>
其中“事件”是二元观察(实验中个体死亡),并且(应该)在第一次观察到后保持 1。
我需要为每个id号确定event == 1的第一次时间,并生成一个id号和第一次观察到的时间的向量,其中event =1。
我原本打算草率地对 event =1 的数据进行子集化,然后只为每个 id 选择周中的最小值,但按 ID 分组时会变得更加草率。然后我尝试了一些聚合,但也很难跨 ID 分组进行聚合。我知道 tidyverse 有一些选择,但我是 n00b。
我相信有一种非常简单的方法可以做到这一点。谢谢!
tidyverse
确实对这类东西超级有帮助。
df %>%
filter(event == 1) %>%
group_by(id) %>%
arrange(id, time) %>%
summarise(time = first(time)) %>%
ungroup()
# A tibble: 2 x 2
id time
<dbl> <dbl>
1 1 4
2 2 2
如果你想保留原始数据帧的结构,试试这个
library(dplyr)
df %>%
group_by(id) %>%
mutate(d=ifelse(event==1, min(time[event>0]), 0)) %>%
ungroup()
# A tibble: 10 × 4
time id event d
<dbl> <dbl> <dbl> <dbl>
1 1 1 0 0
2 2 1 0 0
3 3 1 0 0
4 4 1 1 4
5 5 1 1 4
6 1 2 0 0
7 2 2 1 2
8 3 2 1 2
9 4 2 1 2
10 5 2 1 2
数据
df <- structure(list(time = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5), id = c(1,
1, 1, 1, 1, 2, 2, 2, 2, 2), event = c(0, 0, 0, 1, 1, 0, 1, 1,
1, 1)), class = "data.frame", row.names = c(NA, -10L))
# set as data.table
setDT(df)
# find 1st death event. Fetch row
x <-
df[event == 1
][, xx := 1:.N, id
][xx == 1
][, xx := NULL]
x
time id event
1: 4 1 1
2: 2 2 1
想知道在 R 中确定事件时间的最有效方法是什么。其他答案似乎没有按 ID 分组,这是我需要的一大块。
我的数据是这样的:
time = rep(c(1:5),2)
id = c(rep(1,5),rep(2,5))
event = c(0,0,0,1,1,0,1,1,1,1)
df = data.frame(cbind(time,id,event))
df
time id event
1 1 1 0
2 2 1 0
3 3 1 0
4 4 1 1
5 5 1 1
6 1 2 0
7 2 2 1
8 3 2 1
9 4 2 1
10 5 2 1
>
其中“事件”是二元观察(实验中个体死亡),并且(应该)在第一次观察到后保持 1。
我需要为每个id号确定event == 1的第一次时间,并生成一个id号和第一次观察到的时间的向量,其中event =1。
我原本打算草率地对 event =1 的数据进行子集化,然后只为每个 id 选择周中的最小值,但按 ID 分组时会变得更加草率。然后我尝试了一些聚合,但也很难跨 ID 分组进行聚合。我知道 tidyverse 有一些选择,但我是 n00b。
我相信有一种非常简单的方法可以做到这一点。谢谢!
tidyverse
确实对这类东西超级有帮助。
df %>%
filter(event == 1) %>%
group_by(id) %>%
arrange(id, time) %>%
summarise(time = first(time)) %>%
ungroup()
# A tibble: 2 x 2
id time
<dbl> <dbl>
1 1 4
2 2 2
如果你想保留原始数据帧的结构,试试这个
library(dplyr)
df %>%
group_by(id) %>%
mutate(d=ifelse(event==1, min(time[event>0]), 0)) %>%
ungroup()
# A tibble: 10 × 4
time id event d
<dbl> <dbl> <dbl> <dbl>
1 1 1 0 0
2 2 1 0 0
3 3 1 0 0
4 4 1 1 4
5 5 1 1 4
6 1 2 0 0
7 2 2 1 2
8 3 2 1 2
9 4 2 1 2
10 5 2 1 2
数据
df <- structure(list(time = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5), id = c(1,
1, 1, 1, 1, 2, 2, 2, 2, 2), event = c(0, 0, 0, 1, 1, 0, 1, 1,
1, 1)), class = "data.frame", row.names = c(NA, -10L))
# set as data.table
setDT(df)
# find 1st death event. Fetch row
x <-
df[event == 1
][, xx := 1:.N, id
][xx == 1
][, xx := NULL]
x
time id event
1: 4 1 1
2: 2 2 1