代码之家  ›  专栏  ›  技术社区  ›  jay.sf

如何在中按名称排除列数据表?[副本]

  •  0
  • jay.sf  · 技术社区  · 5 年前

    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))] 
    

    但一旦它变成了 数据表

    0 回复  |  直到 8 年前
        1
  •  301
  •   MichaelChirico    5 年前

    foo 从数据表 df3

    # 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]
    

    数据表 还支持以下语法:

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

    但如果你真的想删除 "foo" (与仅打印 df3型

    (请注意,如果使用依赖 grep() grepl() ,您需要设置 pattern="^foo$" “福” ,如果不希望列的名称为 "fool" "buffoon" (即含有

    接下来的两个习语也会起作用-- df3型 “福” --但如果不这样做,它可能会以一种意想不到的方式失败。例如,如果使用它们中的任何一个来搜索不存在的列 "bar" ,您将以零行结束数据表.

    因此,它们非常适合交互使用,例如,在需要显示数据表减去所有名称包含子字符串的列 “福” . 出于编程目的(或者如果您想从 df3型 方法1、2a和2b确实是最好的选择。

    # Method 4:
    df3[, .SD, .SDcols = !patterns("^foo$")]
    

    最后,还有一些方法使用 with=FALSE ,尽管如此 data.table

    # Method 5a (like Method 3)
    df3[, !"foo", with=FALSE] 
    # Method 5b (like Method 4)
    df3[, !grep("^foo$", names(df3)), with=FALSE]
    # Method 5b (another like Method 4)
    df3[, !grepl("^foo$", names(df3)), with=FALSE]
    
        2
  •  31
  •   SeGa    5 年前

    你也可以使用 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 .

        3
  •  20
  •   msp    9 年前

    我只是用数据框的方式:

    DT$col = NULL
    

    $<- 运算符将导致对象复制。所以最好使用:

    DT[, col:=NULL]
    
        4
  •  10
  •   MichaelChirico    5 年前

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

    因为它绕过了数据表优点,但如果您使用的行数少于50万行,则可以正常工作

        5
  •  4
  •   iled S. Cassidy    7 年前

    假设您的dt有列 col1 col2 , col3 , col4 , col5 coln

    要删除其中的一个子集,请执行以下操作:

    vx <- as.character(bquote(c(col1, col2, col3, coln)))[-1]
    DT[, paste0(vx):=NULL]
    
        6
  •  -2
  •   Yan Foto    5 年前

    下面是一种方法,当您希望将列的#设置为NULL时,给定它们的列名

    deleteColsFromDataTable <- function (train, toDeleteColNames) {
    
           for (myNm in toDeleteColNames)
    
           train <- train [,(myNm):=NULL]
    
           return (train)
    }
    
        7
  •  -3
  •   Serjik    8 年前
    DT[,c:=NULL] # remove column c
    
        8
  •  -7
  •   vmarquez    10 年前

    为了一个数据表,将列指定为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
    

    相当于数据框是:

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

    问:为什么这个版本中有逗号数据表的版本中没有逗号数据框?

    A.作为数据帧存储为列列表时,可以跳过逗号。您也可以将其添加到中,但是需要将它们分配到 NULL 是的, DF[, c("col1", "col2", "col3")] <- list(NULL) .