在使用data.table :: dcast

时间:2017-11-20 07:29:27

标签: r data.table pander dcast

这是一个有趣的问题,因为我找到了一个解决方法,虽然我发现它不是很好。

当我更新pander包(到0.6.1)时,每当我尝试在data.table(包版本1.10)构造的宽格式的data.table上使用pander()时,就会出现错误。使用data.table :: dcast():

的长格式的4-3或更早版本
  

data.table :: setattr(x," row.names",row.names.dt)中的错误:     行名称必须是'字符'或者'整数',而不是' double'

我试图删除任何行名称,但无济于事。经过一些研究,我发现使用reshape2 :: dcast没有错误,但是reshape2 :: dcast转换了data.frame中的data.table,这不是我想要的东西。当然,我可以将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,以防万一。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

这是产生问题的附加属性。设置&#39;已排序&#39; attr到&#39; NULL&#39;它应该工作

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 
#----------------

答案 1 :(得分:0)

除了在dt.widepander()的调用中将dt.wide强制转换为data.frame的明显变通方法

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

  2     15   20 
----------------

data.table的{​​{1}}方法有一个pander()参数(参见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" 定义为 integer time不会抛出错误,但会忽略结果中的pander(dt.wide)列。 (见GitHub issue)。