【问题标题】:Error when using pander on a data.table created with data.table::dcast在使用 data.table::dcast 创建的 data.table 上使用 pander 时出错
【发布时间】:2017-11-20 07:29:26
【问题描述】:

这更像是一个有趣的问题,因为我找到了一种解决方法,尽管我觉得它并不漂亮。

当我更新 pander 包(到 0.6.1)时,每当我尝试在从 data.table(包版本 1.10. 4-3 或更早)使用 data.table::dcast() 的长格式:

data.table::setattr(x, "row.names", row.names.dt) 中的错误: 行名必须是“字符”或“整数”,而不是“双精度”

我尝试删除任何行名,但无济于事。经过一番研究,我发现使用 reshape2::dcast 没有错误,但是 reshape2::dcast 将 data.table 转换为 data.frame,这不是我想要的。当然,我可以将 data.frame 转换回 data.table。

这是一些对我产生错误的示例代码:

library(pander)
library(data.table)

dt.long <- data.table(time=c(1, 1, 2, 2), T=c("c", "t", "c", "t"), count=c(10, 15, 15, 20))
pander(dt.long) # this works fine

dt.wide <- dcast(dt.long, time~T, value.var = "count")
row.names(dt.wide) <- NULL # doesn't help
row.names(dt.wide) <- c() # doesn't help either
pander(dt.wide) # produces error

# work-around
library(reshape2)
dt.wide <- dcast(dt.long, time~T, value.var = "count")
pander(dt.wide) # works fine
class(dt.wide) # but this is a data.frame
dt.wide <- data.table(dt.wide) # now it is a data.table again

有没有一种简单的方法可以将数据保存为 data.table 并像以前一样使用 pander?
我使用 R 版本 3.3.2,以防万一。

提前谢谢你!

【问题讨论】:

    标签: r data.table pander dcast


    【解决方案1】:

    造成问题的是附加属性。将“排序”attr 设置为“NULL”,它应该可以工作

    dt.wide <- dcast(dt.long, time~T, value.var = "count")
    attr(dt.wide, "sorted") <- NULL
    

    或使用setattr

    setattr(dt.wide, 'sorted', NULL)
    pander(dt.wide)
    #----------------
    # time   c    t  
    #------ ---- ----
    #  1     10   15 
    
    #  2     15   20 
    #----------------
    

    【讨论】:

      【解决方案2】:

      除了在对pander() 的调用中将dt.wide 强制转换为data.frame 的明显解决方法(dt.wide 保持不变)

      pander(as.data.frame(dt.wide))
      
      ----------------
       time   c    t  
      ------ ---- ----
        1     10   15 
      
        2     15   20 
      ----------------
      

      pander()data.table 方法有一个keys.as.row.names 参数(参见?pander.data.table)。该参数默认为TRUE

      所以,另一种解决方法是将此参数设置为FALSE

      pander(dt.wide, keys.as.row.names = FALSE)
      
      ----------------
       time   c    t  
      ------ ---- ----
        1     10   15 
      
        2     15   20 
      ----------------
      

      但是,我认为pander() 中存在一个错误,因为dt.wide 未键入。它只是将sorted 属性设置为time

      str(dt.wide)
      
      Classes ‘data.table’ and 'data.frame':    2 obs. of  3 variables:
       $ time: num  1 2
       $ c   : num  10 15
       $ t   : num  15 20
       - attr(*, ".internal.selfref")=<externalptr> 
       - attr(*, "sorted")= chr "time"
      

      请注意,如果time 列定义为整数pander(dt.wide) 不会引发错误,但会从结果中省略time 列。 (见GitHub issue)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多