【问题标题】:condition on multiple rows and multiple columns by ID in r long format tabler长格式表中按ID对多行和多列的条件
【发布时间】: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=1group 在时间 1 和 3 处应为 Y,但它在时间 1 处取值 N,因为x=N

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

谢谢!

【问题讨论】:

  • 不清楚创建group 变量的逻辑是什么。请用文字而不是代码来描述它(特别是因为看起来您的代码没有产生所需的输出)。另外,您说您“希望它们通过 ID 保持不变”,但是在您想要的 ID=1 输出中,您将 NAY 都作为 group。请澄清。
  • 同意@nicola,目标尚不清楚,但现在根据您的预期结果,如果您希望第 1 行:成为 Y 组,您不应该改变(时间==1 和 x== "Y") 到 (time==1 & x=="N")?
  • 谢谢@nicola。我已经编辑了我的问题以澄清我想要什么。
  • 为什么第四行是NA?它有time==1x=="Y"
  • @nicola,第四行是NA,因为ID=2time=3 没有答案。变量 group 仅适用于在时间 1 和 3 都回答的 ID。

标签: r long-format-data


【解决方案1】:

怎么样:

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>

【讨论】:

  • 我的代码得到了同样的结果,但我想要的是group=Y 对应ID=1 time=1time=3。一般规则是:对于每个 ID,如果 x=Y 在时间 1 或 z=YY 在时间 3,group 应该取值 Y(在时间 1 和 3)。
【解决方案2】:

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

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>

【讨论】:

    猜你喜欢
    • 2018-06-03
    • 2022-10-06
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多