table用法 - subset r用法




如何在data.table中按名稱刪除列? (6)

為了擺脫data.frame名為“foo”的data.frame ,我可以這樣做:

df <- df[-grep('foo', colnames(df))]

但是,一旦df被轉換為data.table對象,就沒有辦法只刪除一列。

例:

df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))] 

但是一旦它被轉換為data.table對象,這不再有效。


以下任何操作都會從data.table df3刪除列foo

# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table)
df3[,foo:=NULL]

df3[, c("foo","bar"):=NULL]  # remove two columns

myVar = "foo"
df3[, (myVar):=NULL]   # lookup myVar contents

# Method 2a -- A safe idiom for excluding (possibly multiple)
# columns matching a regex
df3[, grep("^foo$", colnames(df3)):=NULL]

# Method 2b -- An alternative to 2a, also "safe" in the sense described below
df3[, which(grepl("^foo$", colnames(df3))):=NULL]

data.table也支持以下語法:

## Method 3 (could then assign to df3, 
df3[, !"foo", with=FALSE]  

但如果你實際上想從df3刪除列"foo" (相對於只打印df3減去列"foo"的視圖),你真的想要使用方法1。

(請注意,如果您使用依賴於grep()grepl()的方法,如果您不想使用名稱為"fool"列,並且需要設置pattern="^foo$"而不是"foo" "buffoon" (即包含foo作為子字符串的那些)也被匹配並刪除。)

不太安全的選項,適合交互使用:

接下來的兩個成語也會起作用 - 如果df3包含一個匹配"foo"的列 - 但是如果沒有,可能會以意想不到的方式失敗。 例如,如果您使用它們中的任何一個搜索不存在的列"bar" ,那麼最終將得到一個零行data.table。

因此,它們最適合用於交互式使用,例如,可以顯示data.table減去任何含有子字符串"foo"名稱的列。 出於編程目的(或者如果您想要從df3而不是從副本中刪除列),方法1,2a和2b確實是最好的選擇。

# Method 4a:
df3[, -grep("^foo$", colnames(df3)), with=FALSE]

# Method 4b: 
df3[, !grepl("^foo$", colnames(df3)), with=FALSE]

你也可以為此set用戶,避免[.data.table在循環中的開銷:

dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters )
set( dt, j=c(1L,3L,5L), value=NULL )
> dt[1:5]
   b d
1: A a
2: B b
3: C c
4: D d
5: E e

如果你想通過列名來完成,那麼which(colnames(dt) %in% c("a","c","e"))應該適用於j


如果您想將列的列數設置為NULL,以下是一種方法,因為列名稱是您的用法的函數:)

deleteColsFromDataTable < - function(train,toDeleteColNames){

   for (myNm in toDeleteColNames)

   train <- train [,(myNm):=NULL,with=F]

   return (train)

}


對於data.table,將該列分配給NULL會將其刪除:

DT[,c("col1", "col1", "col2", "col2")] <- NULL
^
|---- Notice the extra comma if DT is a data.table

......這相當於:

DT$col1 <- NULL
DT$col2 <- NULL
DT$col3 <- NULL
DT$col4 <- NULL

data.frame的等價物是:

DF[c("col1", "col1", "col2", "col2")] <- NULL
      ^
      |---- Notice the missing comma if DF is a data.frame

問:為什麼data.table版本中有逗號,data.frame版本中沒有逗號?

答:由於data.frames存儲為一列列,所以可以跳過逗號。 你也可以添加它,然後你需要將它們分配給一個NULL s, DF[, c("col1", "col2", "col3")] <- list(NULL)


非常簡單的選項,以防您在數據表中刪除多個單獨的列,並且您希望避免輸入所有列名稱#careadviced

dt <- dt[, -c(1,4,6,17,83,104), with =F]

這將根據列號刪除列。

這顯然不是有效的,因為它繞過了data.table的優點,但是如果你使用的數據少於500,000行,它可以正常工作


DT[,c:=NULL] # remove column c






data.table