说我有一个如下数据表:
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
Run Code Online (Sandbox Code Playgroud)
我想要的是替换> 2到99的值,但仅限于以'b'开头的列.我应该得到
test
# a1 b1 a2 b2
# 1: 1 2 5 99
# 2: 2 99 6 99
# 3: 3 99 7 99
Run Code Online (Sandbox Code Playgroud)
这样做有什么快捷的方法吗?
我们可以grep用来获取以'b'('nm1')开头的列名.指定'nm1' .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]
Run Code Online (Sandbox Code Playgroud)
更快的选择是使用for循环set.由于[.data.table避免了开销,因此效率会更高.
for(j in nm1){
set(test, i= which(test[[j]] >2), j=j, value=99)
}
Run Code Online (Sandbox Code Playgroud)