选择data.table中的列子集

nhe*_*121 25 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"? 
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*rie 37

使用与a非常相似的语法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
Run Code Online (Sandbox Code Playgroud)

with=FALSE在以下j参数的文档中很好地解释了使用?data.table:

Y:一个单一的列名,列名的单expresson,list()列名,一个表达式或函数调用计算结果为清单(包括表达的data.framedata.table它们是列表,太),或(当with=FALSE)作为以J相同[.data.frame.


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

keep <- setdiff(names(dt), "V9")
dt[, ..keep]
Run Code Online (Sandbox Code Playgroud)

前缀符号..将在调用范围(即全局环境)中查找,其值被视为列名或数字().


42-*_*42- 14

这是一种patterns用于转换为数字并允许负列索引的方法:

dt[ , !'V3']
# or
drop_cols = 'V3'
dt[ , !..drop_cols]
Run Code Online (Sandbox Code Playgroud)

你确实说"V3"被排除了,对吧?

  • 使用regex-grep添加条件非常容易.只需使用OR符号"|"即可.`dt [, - grep("^ V3 $ | ^ V9 $",名称(dt),= FALSE) (3认同)

Yva*_*anR 11

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

dt[, -'V3']
Run Code Online (Sandbox Code Playgroud)

对于几列:

dt[, -c('V3', 'V9')]
Run Code Online (Sandbox Code Playgroud)

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


der*_*und 5

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

iris_DT <- as.data.table(iris)

iris_DT[, .SD, .SDcols = patterns(".e.al")]
Run Code Online (Sandbox Code Playgroud)