r - 基于单一条件高效更新多个data.table列

标签 r data.table

这是我需要的一个简单示例:

data <- data.table(x = c(10, -10, 20, -20, 100, -100),
                 y = c(10, -10, 120, -120, 100, -100),
                 z = c(10, -10, 100, -100, 30, -30))

data[x > 90 | x < -90, x:=0]
data[z > 90 | z < -90, z:=0]

这很好用,但我希望用更简单的版本替换最后两行,因为我的实际数据中有很多列(大约 200,其中我需要更新大约 50)和很多行数(大约200万行,所以数据量有点大)

抱歉,如果这是重复的

最佳答案

eval(parse(...)) 可能是最简单和最有效的:

cols <- c("x", "z")
for (col in cols) 
  eval(parse(text = sprintf("data[%s > 90 | %s < -90, %s := 0][]", col, col, col)))
#     x    y   z
#1:  10   10  10
#2: -10  -10 -10
#3:  20  120   0
#4: -20 -120   0
#5:   0  100  30
#6:   0 -100 -30

但是,我可能会融化 data.table:

data <- melt(data)
cols <- c("x", "z")
data[variable %in% cols & (value > 90 | value < -90), value := 0]
#    variable value
# 1:        x    10
# 2:        x   -10
# 3:        x    20
# 4:        x   -20
# 5:        x     0
# 6:        x     0
# 7:        y    10
# 8:        y   -10
# 9:        y   120
#10:        y  -120
#11:        y   100
#12:        y  -100
#13:        z    10
#14:        z   -10
#15:        z     0
#16:        z     0
#17:        z    30
#18:        z   -30

关于r - 基于单一条件高效更新多个data.table列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786896/

相关文章:

r - 应用于 data.table : find rows where a subset of columns are all NA 的行

R函数找到与所有剩余向量相关性最高的向量

r - 如何使用 summarise_at 将不同的函数应用于不同的列?

r - 如何向 geom_boxplot 添加摘要信息

r - 大 ddply,适当的选择

r - 通过引用在函数中添加大量列

linux - Linux R 中的内存使用

r - 无法从数据帧中删除列,输出变成逻辑向量

r - 使用 R 中的 data.table 根据条件合并两行的值

r - 连接键值不完全相等的R data.tables-合并时间最近的行