【发布时间】:2021-12-28 10:14:51
【问题描述】:
我有一个长格式的表格,如下所示:
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%而不是==,但没有解决问题。
谢谢!
【问题讨论】:
-
不清楚创建
group变量的逻辑是什么。请用文字而不是代码来描述它(特别是因为看起来您的代码没有产生所需的输出)。另外,您说您“希望它们通过 ID 保持不变”,但是在您想要的 ID=1 输出中,您将NA和Y都作为group。请澄清。 -
同意@nicola,目标尚不清楚,但现在根据您的预期结果,如果您希望第 1 行:成为 Y 组,您不应该改变(时间==1 和 x== "Y") 到 (time==1 & x=="N")?
-
谢谢@nicola。我已经编辑了我的问题以澄清我想要什么。
-
为什么第四行是
NA?它有time==1和x=="Y"。 -
@nicola,第四行是
NA,因为ID=2在time=3没有答案。变量group仅适用于在时间 1 和 3 都回答的 ID。
标签: r long-format-data