【问题标题】:Subset of data.table excluding some columnsdata.table 的子集,不包括某些列
【发布时间】:2025-12-12 17:45:01
【问题描述】:

我只需要从我的data.table 中排除一组列。我可以通过使用带有这些列数的-c() 来做到这一点:

dti <- data.table(iris)
dti1 <- dti[, -c(3,5), with=F]

但我想使用列名而不是数字,例如

colsExcl <- c('Petal.Length', 'Species');
dti1 <- dti[, -c(colsExcl), with=F] # error: invalid argument to unary operator

【问题讨论】:

  • 它对我有用,没有任何错误。
  • @Metrics,真的吗?您使用的是什么版本的“data.table”?
  • @AnandaMahto:我使用的是 1.9.5。
  • @Metrics,也许他们当时在开发版本中集成了一些不同的行为。

标签: r data.table


【解决方案1】:

您可以尝试setdiff:= NULL,但行为不同。

使用setdiff,您必须将输出分配给另一个对象:

colsExcl <- c('Petal.Length', 'Species')
dti1 <- dti[, setdiff(names(dti), colsExcl), with = FALSE]

相比之下,使用:= NULL 会从原始data.table 中删除列:

dti[, (colsExcl) := NULL][]
#      Sepal.Length Sepal.Width Petal.Width
#   1:          5.1         3.5         0.2
#   2:          4.9         3.0         0.2
#   3:          4.7         3.2         0.2
#   4:          4.6         3.1         0.2
#   5:          5.0         3.6         0.2
#  ---                                     
# 146:          6.7         3.0         2.3
# 147:          6.3         2.5         1.9
# 148:          6.5         3.0         2.0
# 149:          6.2         3.4         2.3
# 150:          5.9         3.0         1.8

【讨论】:

  • 啊,我只是想避免使用names(dti)...但是我错过了:= NULL的解决方案,实际上我可以通过使用copy()来避免修改原始表,如下所示: dti1 &lt;- copy(dti)[, (colsExcl) := NULL]。感谢您提供两种解决方案!
最近更新 更多