【问题标题】:Replace a numerical value by NA based on conditions from other columns:根据其他列的条件将数值替换为 NA:
【发布时间】:2013-04-02 15:44:25
【问题描述】:

我是 data.table 包的新手,请执行我的简单问题。我有一个看起来像 DT 的数据集

DT <- data.table(a = sample(c("C","M","Y","K"),  100, rep=TRUE),
                   b = sample(c("A","S"),  100, rep=TRUE),
                   f = round(rnorm(n=100, mean=.90, sd=.08),digits = 2) ); DT

如果满足特定条件,我想将 f 列中的任何值替换为 NA。例如对于0.85 &gt; f &gt; 0.90,我将有以下条件:

DT$a == "C" & DT$b == "S" & DT$f < .85| DT$a == "C" & DT$b == "S" & DT$f >.90

我还想为 a 和 b 列中的每个分类变量设置不同的条件。

【问题讨论】:

  • 哇,帖子变了好多!
  • 嗨,拉吉。 Arun 回答了您最初的问题,因此典型的 Stack Overflow 协议是接受他的回答并(如果您需要)提出新问题,而不是编辑最初的问题。长期经验表明,对于潜在的回答者和交流的未来读者来说,每个问题一个主题最有效!
  • 谢谢乔希,听起来合乎逻辑。如果我提出一个新问题,我该如何参考我的旧问题?
  • 我把这个问题回滚到原来的状态。请不要将您的问题编辑成完全不同的内容。

标签: r data.table


【解决方案1】:

使用您声明的条件,但没有 DT$ 将子集您的 data.table 用于满足条件的条目,然后您可以使用 j 字段通过引用将 NA 值分配给 f使用:= 运算符。也就是说,

DT[a == "C" & b == "S" & f < .85 | a == "C" & b == "S" & f >.90, f := NA]
which(is.na(DT$f))
# [1]  3 16 31 89

编辑:在 OP 的评论和@Joshua 的好建议之后:

`%between%` <- function(x, vals) { x >= vals[1] & x <= vals[2]}
`%nbetween%` <- Negate(`%between%`)
DT[a %in% c("C", "M", "Y", "K") & b == "S" & f %nbetween% c(0.85, 0.90), f := NA]

%nbetween%%between% 的否定,将给出所需的结果(f 0.90)。还要注意使用%in% 来检查a 的多个值

编辑 2: 在 OP 完全重写之后,恐怕你无能为力,除了 group b == "A", b == "S"。

`%nbetween%` <- Negate(`%between%`)
DT[a == "M" & b %in% c("A", "S") & f %nbetween% c(.85, .90), f := NA]
DT[a == "Y" & b %in% c("A", "S") & f %nbetween% c(.95, .90), f := NA]
DT[a == "K" & b %in% c("A", "S") & f %nbetween% c(.95, 1.10), f := NA]

【讨论】:

  • 谢谢 Arun,我还想循环浏览 a 和 b 列中的所有分类变量
  • 这可能更容易阅读:DT[a == "C" &amp; b == "S" &amp; ! f %between% c(.85, .90), f := NA].
  • 例如,我想一步完成以下所有操作 DT[a == "M" & b == "S" & ! f %between% c(.85, .90), f := NA] 和 DT[a == "Y" & b == "S" & ! f %between% c(.85, .90), f := NA] 和 DT[a == "K" & b == "S" & ! f %between% c(.85, .90), f := NA] 然后对 "A" 重复上述操作
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2023-02-13
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多