【问题标题】:Select columns by class (e.g. numeric) from a data.table从 data.table 中按类(例如数字)选择列
【发布时间】:2014-09-27 15:01:56
【问题描述】:

为什么这不适用于data.table

它适用于data.frame。有没有办法用数据表做到这一点?

x <- data.table(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
y <- x[ , sapply(x, is.numeric)]

这会返回:

v1    v2    v3    v4
TRUE  TRUE  TRUE FALSE

【问题讨论】:

标签: r data.table


【解决方案1】:

From data.table 1.13.0 ".SDcols 接受一个用于选择.SD 的列的函数"。因此,只需.SDcols = is.numeric

x[ , .SD, .SDcols = is.numeric]

【讨论】:

  • 你好你好,我试过了。 dt_c[,.SD, .SDcols = sapply(dt_c, as.character)] 它不起作用。解决方案
  • s/as.character/is.character/.
【解决方案2】:

我们可以编写一个名为where()的自定义助手,然后我们可以对一个data.frame/data.table进行子集化wheref满足:

where <- function(x, f) {
  colnames(x)[vapply(x, f, logical(1))]
}

df[, where(df, is.numeric), with = FALSE]

【讨论】:

    【解决方案3】:

    类似于@akrun 的回答

    Filter(is.numeric, x)
    

    【讨论】:

      【解决方案4】:

      你也可以试试:

       x1 <- x[,Filter(is.numeric, .SD)]
       head(x1,3)
       #   v1 v2 v3
      #1:  1  1  1
      #2:  2  2  2
      #3:  3  3  3
      

      不过,我不得不承认,对于更大的数据集来说,它的速度很慢。

      【讨论】:

        【解决方案5】:

        data.table 需要with=FALSE 来获取列号。

        tokeep <- which(sapply(x,is.numeric))
        x[ , tokeep, with=FALSE]
        

        【讨论】:

        • 需要 which 吗? - x[,sapply(x,is.numeric),with=FALSE]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 2020-08-23
        • 1970-01-01
        相关资源
        最近更新 更多