假设我有一个如下的数据表:
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]
更快的选择是使用带有 set
的 for
循环。由于避免了 [.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/