簡體   English   中英

根據R中事件發生的年齡賦值

[英]Assign value based on age of occurrence of event in R

我有一個縱向數據集,其中包含參與者年齡和一個變量,用於顯示參與者經歷事件 (0/1) 的年齡,如下所示。

id  age  event
 1    0     0
 1    1     0
 1    2     0
 1    3     0
 1    4     0
 1    5     0
 2    0     0
 2    1     1
 2    2     1
 2    3     1
 2    4     1
 2    5     1 
 3    0     0
 3    1     0
 3    2     0
 3    3     1
 3    4     1
 3    5     1

根據事件是從未發生過 (0) 還是發生在 2 歲之前 (1) 或 2 歲之后 (2),我想生成一個名為 timing 的新變量並將每個參與者分配到一個組 (0 ,1,2) 如下:

id  age  event  timing  
 1    0     0      0
 1    1     0      0
 1    2     0      0
 1    3     0      0
 1    4     0      0
 1    5     0      0
 2    0     0      1
 2    1     1      1
 2    2     1      1
 2    3     1      1
 2    4     1      1
 2    5     1      1
 3    0     0      2
 3    1     0      2
 3    2     0      2
 3    3     1      2
 3    4     1      2
 3    5     1      2

我沒有很好的編碼技能,如果有人能提供幫助,我將不勝感激。

1.創建一個最小的可復制示例

df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L),
                     age = c(0L, 1L, 2L, 3L, 4L,5L, 0L, 1L, 2L, 3L, 4L, 5L, 0L, 1L, 2L, 3L, 4L, 5L),
                     event = c(0L,0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L,1L)),
                row.names = c(NA, -18L), class = "data.frame")

2.使用dplyr的解決方案:

library(dplyr)

df %>% 
  left_join(df %>% 
              mutate(timing = if_else(age < 2 & event == 1, 1,
                                      if_else(age >= 2 & event == 1, 2, 0))) %>% 
              group_by(id) %>%
              summarize(timing = ifelse(1 %in% timing, 1,
                                        ifelse(2 %in% timing, 2, 0)))
  )

這將返回:

   id age event timing
1   1   0     0      0
2   1   1     0      0
3   1   2     0      0
4   1   3     0      0
5   1   4     0      0
6   1   5     0      0
7   2   0     0      1
8   2   1     1      1
9   2   2     1      1
10  2   3     1      1
11  2   4     1      1
12  2   5     1      1
13  3   0     0      2
14  3   1     0      2
15  3   2     0      2
16  3   3     1      2
17  3   4     1      2
18  3   5     1      2

您指定的條件與預期的 output 沖突。因此很難確定您需要什么。 從直覺上講,如果事件從未發生,無論參與者的年齡大小, timing值都應始終為 0。 如果正確,則以下嵌套的ifelse子句會創建新變量:

df$timing <- ifelse(df$event==0, 0,
                    ifelse(df$event==1 & df$age==1, 1, 2))

結果:

df
   id age event timing
1   1   0     0      0
2   1   1     0      0
3   1   2     0      0
4   1   3     0      0
5   1   4     0      0
6   1   5     0      0
7   2   0     0      0
8   2   1     1      1
9   2   2     1      2
10  2   3     1      2
11  2   4     1      2
12  2   5     1      2
13  3   0     0      0
14  3   1     0      0
15  3   2     0      0
16  3   3     1      2
17  3   4     1      2
18  3   5     1      2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM