按 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=1
,group
在时间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>
我有一个 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=1
,group
在时间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>