这更多的是一个有趣的问题,因为我找到了一个解决方案,虽然我觉得它不漂亮。
当我更新pander包(到0.6.1)时,每当我尝试使用宽格式的data.table (包1.10.4-3或更高版本)使用data.table::dcast()构建宽格式的pander()时,就会出现错误:
Data.table::setattr中的错误(x,"row.names",row.names.dt):行名必须是‘字符’或‘整数’,而不是'double‘
我试图删除任何行名,但都没有用。经过一些研究后,我发现使用reshape2 2::dcast没有错误,但是repe2::dcast在data.frame中转换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,以防这件事发生。
提前谢谢你!
发布于 2017-11-20 07:36:03
造成问题的是附加属性。将‘排序’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
#----------------发布于 2017-11-21 09:51:46
此外,在对dt.wide的调用(dt.wide保持不变)中,胁迫pander()到data.frame的明显解决办法是:
pander(as.data.frame(dt.wide))data.table方法的pander()有一个keys.as.row.names参数(参见?pander.data.table)。默认情况下,此参数为TRUE。
因此,另一个解决办法是将此参数设置为FALSE。
pander(dt.wide, keys.as.row.names = FALSE)但是,我认为pander()中存在一个bug,因为dt.wide没有键控。它只是将sorted属性设置为time
str(dt.wide)类‘data.table’和‘data.framework’:2个obs。3个变量:$ time: num 1 2$c: num 10 15 $t: num 15 20 - attr(*,".internal.selfref")= - attr(*,“排序”)= chr "time“
注意,如果列time被定义为整数,则pander(dt.wide)不会抛出错误,而是从结果中省略time列。(见GitHub问题)。
https://stackoverflow.com/questions/47386954
复制相似问题