考虑以下代码:
library(data.table)
dataT <-data.table(1:15,runif(15),runif(15),runif(15))
for(vrb in names(dataT)) {
dataT[get(vrb) < 0.5, (vrb):=0.5] # update value
}
从代码中可以推断,我基本上将每列的最低值限制为0.5。对于子集行,我使用了get
函数。
这是正确的做法,还是有其他方式,与data.table更加一致?
答案 0 :(得分:2)
我们可以使用set
for(vrb in names(dataT)){
set(dataT, i = which(dataT[[vrb]] < 0.5), j = vrb, value = 0.5)
}
第一列中的元素是> 0.5。因此,我们可以在除第一个
之外的列上应用set
for(vrb in names(dataT)[-1]){
set(dataT, i = which(dataT[[vrb]] < 0.5), j = vrb, value = 0.5)
}
答案 1 :(得分:0)
在更新之前不首先进行子集化可能会略微降低性能,但我发现它更具可读性:
dataT[, colnames(dataT) := lapply(.SD, pmax, .5)][]