首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在用data.table创建的data.table::dcast上使用pander时出错

在用data.table创建的data.table::dcast上使用pander时出错
EN

Stack Overflow用户
提问于 2017-11-20 07:29:26
回答 2查看 283关注 0票数 1

这更多的是一个有趣的问题,因为我找到了一个解决方案,虽然我觉得它不漂亮。

当我更新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。

下面是一些为我生成错误的示例代码:

代码语言:javascript
复制
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,以防这件事发生。

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-20 07:36:03

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

代码语言:javascript
复制
dt.wide <- dcast(dt.long, time~T, value.var = "count")
attr(dt.wide, "sorted") <- NULL

或者使用setattr

代码语言:javascript
复制
setattr(dt.wide, 'sorted', NULL)
pander(dt.wide)
#----------------
# time   c    t  
#------ ---- ----
#  1     10   15 

#  2     15   20 
#----------------
票数 1
EN

Stack Overflow用户

发布于 2017-11-21 09:51:46

此外,在对dt.wide的调用(dt.wide保持不变)中,胁迫pander()到data.frame的明显解决办法是:

代码语言:javascript
复制
pander(as.data.frame(dt.wide))

data.table方法的pander()有一个keys.as.row.names参数(参见?pander.data.table)。默认情况下,此参数为TRUE

因此,另一个解决办法是将此参数设置为FALSE

代码语言:javascript
复制
pander(dt.wide, keys.as.row.names = FALSE)

但是,我认为pander()中存在一个bug,因为dt.wide没有键控。它只是将sorted属性设置为time

代码语言:javascript
复制
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问题)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47386954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档