r - 如何对某些列进行子集化并更改数据表的值

标签 r data.table

假设我有一个如下的数据表:

test <- data.table(a1=1:3,b1=2:4,a2=5:7,b2=7:9)
test
#    a1 b1 a2 b2
# 1:  1  2  5  7
# 2:  2  3  6  8
# 3:  3  4  7  9

我想要的是替换 > 2 到 99 的值,但仅适用于以“b”开头的列。我应该得到

test
#    a1  b1 a2  b2
# 1:  1   2  5  99
# 2:  2  99  6  99
# 3:  3  99  7  99

有什么快速的方法吗?

最佳答案

我们可以使用 grep 来获取以'b'('nm1')开头的列名。在 .SDcols 中指定 'nm1',遍历列 (.SD),使用 replace 更改大于 2 的值到 99,并将 (:=) 输出分配回相应的列。

nm1 <- grep('^b', names(test), value = TRUE)
test[, (nm1) := lapply(.SD, function(x) 
          replace(x, x>2, 99)) , .SDcols= nm1]

更快的选择是使用带有 setfor 循环。由于避免了 [.data.table 的开销,效率会更高。

for(j in nm1){
  set(test, i= which(test[[j]] >2), j=j, value=99)
}

关于r - 如何对某些列进行子集化并更改数据表的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35883464/

相关文章:

r - 在 R 中创建重复函数调用的结果向量

r - 将函数应用于data.table的每一行

r - levelplot - 如何使用它,有什么简单的例子吗?

p#q#c# 的 R 正则表达式

r - 如何对 data.table 中的多个列进行分组?

R data.table 奇怪的值/引用语义

替换data.table中多列中的值

r - 如何使用 data.table 有效地计算行中位数

r - 是否可以在 R 中使用 sendmail 抄送收件人?

r - 合并多列中的数据以按另一列中的唯一值进行分组