【问题标题】:data.table operations by column name with spaces fails带有空格的列名的 data.table 操作失败
【发布时间】:2015-08-25 18:18:39
【问题描述】:

可重现的例子

#Use the Iris data set
library(data.table)
iris 
colnames(iris)[3] <- "Petal Length"
iris <- as.data.table(iris)

访问没有空格的列很好

iris[,Petal.Width]

但是访问名称中包含空格的列是行不通的

iris[,Petal Length]
iris[,'Petal Length']

唯一的解决办法似乎是

iris[,iris$'Petal Length']

评论 我是 data.table 的新手。我知道 data.table 中有很多怪癖;这是其中之一吗?我会更改我的变量名称以摆脱空格,但如果我不需要,我不希望这样做。我还阅读了有关列名的先前问题-自从上一个问题更新允许以来,我在两年内理解-当 colname 没有空格时,可以轻松看出这一点。

【问题讨论】:

  • 我觉得有必要补充一点,坚持使用带有空格的名称似乎很固执。这只会令人讨厌。三种可能的选择:petal_lengthpetal.lengthpetalLength

标签: r data.table


【解决方案1】:

2020 年 4 月 22 日更新

data.table 已经发展,现在iris[ , 'Petal.Length'] 将返回一个单列表(即j 中的字符和整数文字向量可用于列选择)。在扩展.SDcols 以进行列过滤的常见用例方面也有大量更新(按名称上的模式进行子集化,通过逻辑聚合进行子集化);有关详细信息,请参阅新闻。

以下留给后人。


只需按照data.table FAQ 点 1.1-1.3 和 2.17 中的说明使用 with = FALSE

iris[ ,'Petal Length', with = FALSE]

并确保阅读优秀的introduction to data.table PDF vignette and the new HTML vignettes


在这种情况下,对于您所期望的(向量),使用[[ 更合适:

iris[['Petal Length']]

或者,您也可以将列名作为j 中的变量来引用:

iris[, `Petal Length`] # note the backticks.

【讨论】:

  • 恰恰相反,非常高兴,现在看起来更干净,信息量更大!无论如何,我想编辑反引号,而 [[ 部分对我来说甚至是新的!所以我学到了一些新东西
  • 谢谢。不知道存在常见问题解答。干杯。
  • 你确定这也适用于子集吗?如果,比如说,你有一个条件 iris[ ,'Petal Length' == &lt;X&gt;, with = FALSE] 这似乎不再正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多