我想打印数据表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"))]
所以,我的问题是:是否有另一种方法可以不在数据表中打印一列而无需按编号引用它?我想找到类似于我上面使用的数据帧语法但使用数据表的东西。
答案 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=FALSE
中j
参数的文档中很好地解释了?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")]