首页 > 解决方案 > 根据逻辑条件选择 data.table 中的单个元素

问题描述

我正在考虑根据特定条件更改 data.table 的一些单个元素。基本上,如果 DT 的一个元素与向量的一个元素匹配,invalid_values我想将其设置为 -99。

我在下面给出了一个简单的可重现示例。检查 DT 的所有值以匹配一个值可以正常工作,但是当我切换到 %in% 时,它不能按预期工作。我想在这里避免一个 for 循环。

DT = data.table(
a = rep(c(2,9), 5),
b = rep(c(7,5), 5),
c = rep(c(1,2), 5),
d = rep(c(4,8), 5)
)

invalid_values <- c(2, 7)

# wiith loop
for (i in seq(invalid_values)) {
  DT[DT == invalid_values[i] <- -99]
}

# idea
DT[DT %in% invalid_values] <- -99

任何帮助表示赞赏。

标签: rdata.table

解决方案


%in%不会直接在 dataframe/data.table 上工作。用于lapply迭代列和要replace的值 。invalid_values-99

library(data.table)
DT[, lapply(.SD, function(x) replace(x, x %in% invalid_values, -99))]

#      a   b   c d
# 1: -99 -99   1 4
# 2:   9   5 -99 8
# 3: -99 -99   1 4
# 4:   9   5 -99 8
# 5: -99 -99   1 4
# 6:   9   5 -99 8
# 7: -99 -99   1 4
# 8:   9   5 -99 8
# 9: -99 -99   1 4
#10:   9   5 -99 8

推荐阅读