【问题标题】:Why do I have to use `[[1]]` with data.table everywhere? [duplicate]为什么我必须在任何地方都使用 `[[1]]` 和 data.table? [复制]
【发布时间】:2020-12-26 19:33:22
【问题描述】:

用变量名索引DT列后,数据以data.table data.frame类型返回,并且该列不是可访问向量,我必须先将其取消列出。我是否按预期做所有事情?
考虑这个例子:

require(data.table)
DT <- data.table(a=seq(1.001, 10.999, length=100), b=factor(c(rep('a', 55), rep('b', 45))))
col.name <- 'a'
diff(DT[, col.name]) #column name not found error
diff(DT[, col.name, with=FALSE]) #null data table
diff(DT[, col.name, with=FALSE][[1]]) #works

第二个例子是关于什么问题。

【问题讨论】:

  • 或许可以试试:as.data.frame(DT)[, col.name]
  • DT[, 'a', with = FALSE] 返回一个 data.table 与一列 'a'DT$a 返回一个向量 - 这就是它的工作原理
  • 这是另一种方式:diff(DT[[col.name]])
  • @inscaven,如何将变量列名与 $ 运算符一起使用? [at]ismirsehregal,是的,这是正确的答案。
  • 顺便说一句。而不是with = FALSE 你可以使用DT[, ..col.name]

标签: r list data.table categorical-data


【解决方案1】:

您有许多选项来检索单个列。在我看来,最易读的选项是使用.SD,虽然不是最快的。通常还希望不将单列 data.tables 转换为向量。

require(data.table)
DT <- data.table(a=seq(1.001, 10.999, length=100), b=factor(c(rep('a', 55), rep('b', 45))))

DT[ , get(col.name) ] # vector
DT[[ col.name ]] # vecotr
DT[ , col.name, with = FALSE ] # data.table
DT[ , .SD, .SDcols = col.name ] # data.table

【讨论】:

    【解决方案2】:

    根据您的输入,有两种(直接)方法来获取向量而不是 data.table:

    DT[, get(col.name)]
    DT[[col.name]] # as per comment by ismirsehregal 
    

    还有一些同样令人费解的DT[, col.name, with=FALSE][[1]]

    with(DT, eval(parse(text=col.name)))
    DT[, ..col.name][[1]] # as per comment by ismirsehregal 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-16
      • 2017-12-10
      • 2020-03-06
      • 2014-07-02
      • 2020-12-15
      • 1970-01-01
      • 2020-08-19
      • 2015-03-09
      相关资源
      最近更新 更多