根据列值更新data.table中的列值

时间:2016-10-18 07:13:55

标签: r data.table

考虑以下代码:

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更加一致?

2 个答案:

答案 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)][]