【问题标题】:Why Doesn't dt[,ncol(dt)] Return Column Contents?为什么 dt[,ncol(dt)] 不返回列内容?
【发布时间】:2020-11-24 22:31:13
【问题描述】:

我已经根据 @akrun 的 cmets 编辑了这个问题(谢谢!),意识到我没有准确地提出我的问题。

我很困惑为什么以下不返回数据表中最后一列的内容。

> dt <- data.table(A=c(10,10,10),B=c(20,20,20),C=c(30,30,30))
> dt[,ncol(dt)]
[1] 3

如果我使用with=F,它的行为与我预期的一样,将最后一列作为数据表返回

> dt[,ncol(dt),with=F]
   C
1: 30
2: 30
3: 30

这将返回与dt[,3] 相同的结果,这是有道理的。但是为什么dt[,ncol(dt)] = dt[,3] 不是真的呢?来自?data.table

当 j 是要选择的列名或位置的向量时(如在 data.frame 中)。不再需要使用 with=FALSE。

ncol(dt) 不是返回一个列位置向量,一个长度为 1 的向量吗?为什么dt[,ncol(dt)] 不返回最后一列的内容?

感谢您的帮助!

【问题讨论】:

    标签: r datatable data.table


    【解决方案1】:

    对于data.frame,我们需要drop = FALSE

    df[,ncol(df), drop = FALSE]
    

    如果我们检查?Extract,默认情况下它是TRUE

    x[i, j, ... , drop = TRUE]


    对于data.table,我们需要with = FALSE

     dt[, ncol(dt), with = FALSE]
    

    ?data.table 帮助中提到了它

    当 j 是列名的字符向量时,要选择的列位置的数字向量或 startcol:endcol 的形式,并且返回的值始终是 data.table。 with=FALSE 不再需要动态选择列。请注意,x[, cols] 等价于 x[, ..cols] 和 x[, cols, with=FALSE] 和 x[, .SD, .SDcols=cols]。

    【讨论】:

    • 谢谢@akrun,但我想知道为什么dt[,ncol(dt)] 不等于df[,ncol(df)]。我知道我需要包含 drop=F 用于数据框和 with=F 用于数据表以获取返回的表,但我想要从数据表返回的向量。对于这个例子,为什么dt[,3] 不等于dt[,ncol(dt)]
    • @jeromeResearch 你可以使用[[ 子集dt[, .SD[[ncol(.SD)]]]
    • 我没有想到那个,但是有很多方法可以得到最后一列。另一种选择:dt[,ncol(dt),with=F][[1]]。但我仍然很困惑为什么dt[,ncol(dt)] 返回ncol(dt)。我希望数据表和数据框在这里的行为方式相同,但事实并非如此。
    • @jeromeResearch 他们没有相同的默认选项,他们的行为也不同。所以,你不能指望它同样工作
    • 感谢您与我讨论这个问题。忘记期望它表现得像一个数据框。对于这个例子,为什么dt[,ncol(dt)]返回3而不是第三列的内容?
    猜你喜欢
    • 2016-06-18
    • 2021-07-02
    • 2022-08-18
    • 2017-07-07
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2021-07-30
    相关资源
    最近更新 更多