我正在使用data.table
。可以从data.table
对象中轻松选择列:
> head(data.table(mtcars)[,2])
cyl
1: 6
2: 6
3: 4
4: 6
5: 8
6: 6
但尝试在ecdf
调用中使用此语法选择列会产生错误:
> ecdf(data.table(mtcars)[,2])(data.table(mtcars)[,2])
[.data.frame
(x,i)中的错误:选择了未定义的列
有人可以解释我为什么请?
务实地说,解决这个问题的方法是:
> ecdf(data.table(mtcars)[[2]])(data.table(mtcars)[[2]])
[1] 0.56250 0.56250 0.34375 0.56250 1.00000 0.56250 1.00000 0.34375 0.34375 0.56250 0.56250 1.00000 1.00000 1.00000 1.00000 1.00000
[17] 1.00000 0.34375 0.34375 0.34375 0.34375 1.00000 1.00000 1.00000 1.00000 0.34375 0.34375 0.34375 1.00000 0.56250 1.00000 0.34375
但我想了解上述行为。
答案 0 :(得分:0)
原因在于提取。在第一种情况下,它仍然是一个data.table,而在第二种情况下,它是vector
data.table(mtcars)[[2]]
#[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
data.table
和data.frame
语法略有不同。在data.table
中,[
默认使用drop = TRUE
。因此,使用,
并仅选择单个列会将维度删除为vector
为了保持一致性,以便在函数中使用data.table时 接受不同的输入,你可以依靠DT [...]返回data.table。 你不必记得像你一样包含drop = FALSE data.frame。 data.table于2006年首次发布并且存在这种差异 到data.frame从一开始就是一个功能。