从数据框转换为数据表时,使用head(..)出现错误

3
以下是一个可重现的示例,显示了问题:
openSummary <- read.table(textConnection(
"Dates          dollarA         numTotal
7/3/2011    52730.56    1614
7/10/2011   77709.43    1548"), header = TRUE)
openSummary$Dates <- strptime(openSummary$Dates,"%m/%d/%Y")
str(openSummary)
head(openSummary) # No problem

openSummaryDT <- data.table(openSummary)
str(openSummaryDT)
head(openSummaryDT) # An error is produced

在执行 head(openSummaryDT) 时出现错误。
Error in `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE),  : 
length of 'dimnames' [1] not equal to array extent 

请解释错误原因并说明如何避免。但是,我发现可以在数据框和数据表上进行某些操作,并且得到相同的结果。

difftime(Sys.Date(), openSummary[ ,"Dates"])
difftime(Sys.Date(), openSummaryDT[ ,Dates])

非常感谢您的提前帮助

1个回答

5

这是一个有趣的错误,原因是日期以POSIXlt格式表示。 请看:

openSummary$Dates <- as.Date(openSummary$Dates)
head(data.table(openSummary))
#         Dates  dollarA numTotal
# 1: 2011-07-03 52730.56     1614
# 2: 2011-07-10 77709.43     1548

如果您尝试打印原始表格,您会得到相同的错误,但有一条回溯信息,它看起来像这样:

> openSummaryDT
# Error in `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE),  : 
#  length of 'dimnames' [1] not equal to array extent
# In addition: Warning message:
#  In cbind...
# Enter a frame number, or 0 to exit   
# 1: print(list(Dates = list(sec = c(0, 0), min = c(0, 0), hour = c(0, 0), m
# 2: print.data.table(list(Dates = list(sec = c(0, 0), min = c(0, 0), hour =
# 3: `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE), ":", sep 
> 3
# Called from: print.data.table(list(Dates = list(sec 
Browse[1]> ls()
# [1] "dn"    "value" "x"   
Browse[1]> x
#       Dates     dollarA    numTotal
# sec   "0,0"     "52730.56" "1614"  
# min   "0,0"     "77709.43" "1548"  
# hour  "0,0"     "52730.56" "1614"  
# mday  "3,10"    "77709.43" "1548"  
# mon   "6,6"     "52730.56" "1614"  
# year  "111,111" "77709.43" "1548"  
# wday  "0,0"     "52730.56" "1614"  
# yday  "183,190" "77709.43" "1548"  
# isdst "1,1"     "52730.56" "1614"  

基本上,无论出于何种原因,将 data.table 转换为文本形式以进行打印/标题的过程会暴露 POSIXlt 对象的基础列表/向量特性。


2
目前 data.table 不支持 POSIXlt 列(请参见此处)。 - mnel
1
@mnel 看起来应该会出错,不是吗?感谢链接,我没有意识到这一点(虽然我从未需要使用 POSIXlt)。 - BrodieG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接