2017-02-09 81 views
1

我想將某些列設置爲NA。例如:如何最有效地將data.table中的列設置爲NA?

DT2 <- data.table(Id = rep(c(1,2,3),each = 20), 
       x1 = rnorm(20), 
       x2 = rnorm(20), 
       x3 = c(NA,NA,rnorm(18))) 
DT2[,2] <- NA # sets the second column NA 

出人意料的是,DT2[,c(F,T,F,F)] <- NA不會在這種情況下工作,需要使用which。 但是,當您通過索引將許多列設置爲NA時,上述內容在大數據表中似乎相當緩慢。我想知道是否有更好的方法,也許使用set? 感謝您的任何提示!

+0

'datatable'不明確。你在工作什麼語言/ DBMS? – Tim

+0

最好使用列名稱,並通過引用'DT2 [,x1:= NA]'進行分配。使用索引更可能導致錯誤。如果您意外地使用了錯誤的索引會怎麼樣? –

+0

好吧,但如果我刪除條件上的列呢?所以基本上我有刪除列的索引。有了數據框,它非常簡單:'df [,ind] < - NA'。 – user3032689

回答

0

弗蘭克指出出一個需要使用:=來提高速度,例如用上面的例子:

DT[, (c(2,3)) := NA] 
0

儘管您可以使用列位置來更新值,但如果列順序發生更改,通常最好使用列名進行編碼以防止出現問題。下面展示瞭如何通過名稱

library(data.table) 

DT2[, x1 := NA] 
DT2[, c("x1", "x3") := NA] 

如果你想使用data.frame語法設定一個單一的列或多所有值(它實際上更快與小數據集)

DT2[, "x1"] <- NA 
DT2[, c("x1", "x3")] <- NA 
+0

我的確知道如何使用colnames,但是如果我有數以千計的具有隨機名稱模式的列,我在測試某個條件時應如何知道名稱,例如讓我們說一定數量的非na的每列?我知道的唯一方法是使用colindices而不是名稱。 – user3032689

+0

如果您正在測試列以返回索引,那麼無論順序如何,它都會選擇正確的列。問題出現了,你是在編碼可能產生問題的列號。 – manotheshark