选择data.table中的列子集

时间:2012-08-13 19:01:16

标签: r data.table

我想打印数据表dt的所有列,但其中一列名为V3,但不想按编号而是按名称引用它。这是我的代码:

  dt = data.table(matrix(sample(c(0,1),5,rep=T),50,10))
  dt[,-3,with=FALSE]   #  Is this the only way to not print column "V3"? 

使用data frame方式,可以通过代码执行此操作:

  df = data.frame(matrix(sample(c(0,1),5,rep=T),50,10))
  df[,!(colnames(df)%in% c("X3"))]

所以,我的问题是:是否有另一种方法可以不在数据表中打印一列而无需按编号引用它?我想找到类似于我上面使用的数据帧语法但使用数据表的东西。

4 个答案:

答案 0 :(得分:34)

使用与data.frame非常相似的语法,但添加参数with=FALSE

dt[, setdiff(colnames(dt),"V9"), with=FALSE]
    V1 V2 V3 V4 V5 V6 V7 V8 V10
 1:  1  1  1  1  1  1  1  1   1
 2:  0  0  0  0  0  0  0  0   0
 3:  1  1  1  1  1  1  1  1   1
 4:  0  0  0  0  0  0  0  0   0
 5:  0  0  0  0  0  0  0  0   0
 6:  1  1  1  1  1  1  1  1   1

with=FALSEj参数的文档中很好地解释了?data.table的使用:

j:单个列名,列名的单个表达式,列名表达式的list(),计算结果列表的表达式或函数调用(包括data.frame和{{1也是列表,或者(data.table)与with=FALSE中的j相同。


v1.10.2 开始,也可以按如下方式执行此操作:

[.data.frame

使用keep <- setdiff(names(dt), "V9") dt[, ..keep] 前缀符号将在调用范围(即全局环境)中查找,其值被视为列名或数字(source)。

答案 1 :(得分:13)

以下是使用grep转换为数字并允许负列索引的方法:

dt[, -grep("^V3$", names(dt)), with=FALSE]

你确实说“V3”被排除了,对吗?

答案 2 :(得分:11)

也许只有最新版本的data.table(我使用的是1.9.6),但你可以这样做:

dt[, -'V3', with=FALSE]

有几栏:

dt[, -c('V3', 'V9'), with=FALSE]

请注意,变量名称周围的引号是必需的。

答案 3 :(得分:3)

从1.12.0版开始,还可以使用名称上的正则表达式选择列:

iris_DT <- as.data.table(iris)

iris_DT[, .SD, .SDcols = patterns(".e.al")]