【问题标题】:safely turn a data.table back into a data.frame安全地将 data.table 转回 data.frame
【发布时间】:2012-12-11 00:13:48
【问题描述】:

从对象中删除/删除 data.table 类,将其转回 data.frame 的最安全方法是什么?

我问是因为我使用的脚本依赖于以下代码:

newcol.index <- ncol(my.data) +1
my.data[,newcol.index] <- 3
colnames(my.data)[newcol.index] <- "test"

data.table 包显然不喜欢这样,但使用 data.frame 类的对象可以正常工作。

【问题讨论】:

  • 这甚至不适用于 data.frame。 DF &lt;- data.frame(a=1:2,b=1:2); colnames(DF)[3] &lt;- 'z' 给出错误 Error in colnames&lt;-(*tmp*, value = c("a", "b", "hello")) : 'names' 属性 [3] 的长度必须与向量 [2]
  • 编辑了帖子以准确描述 data.table 中的问题所在

标签: r data.table


【解决方案1】:

data.tables 的as.data.frame 方法可能是最安全的函数。 (尝试输入 getAnywhere("as.data.frame.data.table") 以查看它的确切作用。)

library(data.table)
DT <- data.table(a=1:4, b=letters[c(1,1,2,2)], key="a")

class(as.data.frame(DT))  ## OR:  as(X, "data.frame")
# [1] "data.frame"

【讨论】:

  • 这些天我们有setDF
  • @user5359531 -- 与我提出的解决方案不同,setDF() 更改了对象的类。要查看它的实际效果,请运行我的答案中的前两行代码,然后执行class(DT); setDF(DT); class(DT)
  • @JoshO'Brien 考虑到时代已经改变,我想知道是否值得更新您的答案正文?
【解决方案2】:

如果您愿意将脚本转换为 data.table,您可以使用 := 通过引用分配,这将自动分配给 (ncol(youdata)+1)th 列,您可以将名称的字符向量传递给函数的 LHS。它将通过引用分配,所以不要复制!

DT <- data.table(a = 1, b = 2)

DT[,'test' := 3]


DT
   a b test
1: 1 2    3

【讨论】:

    【解决方案3】:

    这是一个如何将 data.table 转换为 data frame

    的示例
    library(tidyverse)
    library(data.table)
    
    df <- data.frame(a = 1:5, b = 6:10, c = LETTERS[5:9])
    class(df)
    #[1] "data.frame"
    
    df <- data.table(df)
    class(df)
    #[1] "data.table" "data.frame"
    
    class(df) <- class(as.data.frame(df))
    class(df)
    #[1] "data.frame"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 2016-08-08
      • 2013-05-07
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多