2016-10-18 80 views
3

考慮下面的代碼:更新列值,基於列的值

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

我們可以使用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) 
} 
0

這可能不更新之前第一子集劃分輕微的性能損失,但我覺得它更易讀:

dataT[, colnames(dataT) := lapply(.SD, pmax, .5)][]