2014-07-05 742 views
23

我試圖以類似的方式操縱一些data.tables,並且想寫一個函數來完成此操作。我想傳入一個參數,其中包含將執行操作的列的列表。當列的向量聲明是:=運算符的左側時,此函數可以正常工作,但如果聲明較早(或傳入函數),則不會。以下代碼顯示了該問題。從R data.table刪除多個列與刪除列的參數

dt = data.table(a = letters, b = 1:2, c=1:13) 
colsToDelete = c('b', 'c') 
dt[,colsToDelete := NULL] # doesn't work but I don't understand why not. 
dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns 

錯誤是「添加新列'colsToDelete',然後指定NULL(刪除它)。」很明顯,它將'colsToDelete'解釋爲一個新的列名。做沿着這些路線

dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames] 

我加入R東西的時候,而是更有經驗一些其他語言發生

同樣的問題,所以這可能是一個愚蠢的問題。

回答

33

這基本上是因爲我們允許:=的LHS符號添加新列以方便使用:例如:DT[, col := val]。因此,爲了區分col本身是否是存儲在列名中的col中的名稱,我們檢查LHS是name還是expression

如果它是一個name,它會在LHS中添加名稱列,如果expression,那麼它會被評估。

DT[, col := val] # col is the column name. 

DT[, (col) := val] # col gets evaluated and replaced with its value 
DT[, c(col) := val] # same as above 

的首選成語是:dt[, (colsToDelete) := NULL]

HTH

3

爲了擴展在前面的回答,您可以參考刪除列做:

# delete columns 10 to 15 
dt[ , (10:15) := NULL ] 

# delete columns 3, 5 and 10 to 15 
dt[ , (c(3,5,10:15)) := NULL ]