按 r 长格式的 ID 对多行和多列进行条件 table

condition on multiple rows and multiple columns by ID in r long format table

我有一个 table 的长格式,如下所示:

dt <- data.table(ID=c(rep(1,3),rep(2,2)), time=c(1:3,1,2), x=c("N","N","Y","Y","N"), z=c(NA,NA,"YY",NA,NA))
dt
   ID time x    z
1:  1    1 N <NA>
2:  1    2 N <NA>
3:  1    3 Y   YY
4:  2    1 Y <NA>
5:  2    2 N <NA>

现在,对于在时间 1 和 3 中回答的 ID,我想创建一个基于两种可能组合的变量:如果 x=Y(时间 1)或 z=YY(时间 3) ), group 在时间 1 和时间 3 中都应该是 Y(但在时间 2 中不是,应该是 NA)。

因此,期望的输出是:

   ID time x    z group
1:  1    1 N <NA>     Y
2:  1    2 N <NA>  <NA>
3:  1    3 Y   YY     Y
4:  2    1 Y <NA>  <NA>
5:  2    2 N <NA>  <NA>

我写了下面的代码,但没有得到我预期的结果:

setDT(dt)[ID==1, group := ifelse((time==1 & x=="Y") | (time==3 & z=="YY"), "Y", "N"), by=ID][
          time==2, group := NA]
dt
   ID time x    z group
1:  1    1 N <NA>     N
2:  1    2 N <NA>  <NA>
3:  1    3 Y   YY     Y
4:  2    1 Y <NA>  <NA>
5:  2    2 N <NA>  <NA>

对于ID=1group在时间1和3应该是Y,但是它在时间1取值N因为x=N

我试过 %in% 而不是 ==,但没有解决问题。

谢谢!

怎么样:

dt$group <- ifelse((dt$time  == 1 & dt$x == "N") | (dt$time == 3 & dt$z == "YY"), dt$x, NA)

或者,使用 dplyr

library(dplyr)

dt %>% 
  mutate(group = ifelse((time  == 1 & x == "N") | (time == 3 & z == "YY"), x, NA))

在这两种情况下:

   ID time x    z group
1:  1    1 N <NA>     N
2:  1    2 N <NA>  <NA>
3:  1    3 Y   YY     Y
4:  2    1 Y <NA>  <NA>
5:  2    2 N <NA>  <NA>

根据 的答案,我想出了如何获得所需的输出:

setDT(dt)[ID==1, group := ifelse(any(x[time==1]=="Y") | any(z[time==3]=="YY"), "Y", "N"), by=ID][
          time==2, group := NA]

dt
   ID time x    z group
1:  1    1 N <NA>     Y
2:  1    2 N <NA>  <NA>
3:  1    3 Y   YY     Y
4:  2    1 Y <NA>  <NA>
5:  2    2 N <NA>  <NA>