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

时间:2016-03-09 05:17:30

标签: 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

我想要的是取代&gt; 2到99,但仅适用于以'b'开头的列。我应该

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

任何快速的方法吗?

1 个答案:

答案 0 :(得分:7)

我们可以使用grep来获取以&#39; b&#39;开头的列名称(&#39; NM1&#39)。指定&#39; nm1&#39;在.SDcols中,循环遍历列(.SD),使用replace更改大于2到99的值,并将输出(:=)分配回各栏目。

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

更快的选择是使用for循环set。由于避免了[.data.table的开销,因此效率会更高。

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