【问题标题】:`write.dbf` fails with an object of class `tbl_df``write.dbf` 因类 `tbl_df` 的对象而失败
【发布时间】:2015-08-29 14:07:19
【问题描述】:

我对@9​​87654321@ 文件以及dplyr 做了很多工作。 write.dbf() 中有一个错误,它阻止将 tbl_df 对象写入 .dbf 文件。

不幸的是,错误消息写得不好,因此很难弄清楚到底发生了什么。

这是一个 MWE

library(dplyr)
library(foreign)

d <- data_frame( x = 1:4, y = rnorm(4) )
write.dbf(d, "test.dbf")
  Error in write.dbf(d, "test.dbf") : unknown column type in data frame

【问题讨论】:

  • write.dbf(tbl_dt(d), "test.dbf") 适合你吗?
  • 事实上,我通常使用write.dbf(as.data.frame(d), "test.dbf") 来解决这个问题,尽管你的可能更快。

标签: r dplyr


【解决方案1】:

这里的解决方案是将d的类强制为裸data.frame

class(d)
 [1] "tbl_df"     "tbl"        "data.frame"
df <- as.data.frame(d)
class(df)
 [1] "data.frame"
write.dbf(as.data.frame(df), "test.dbf")  # works

我已向foreign 人提交了一份错误报告,但希望这篇文章可以减轻其他人的痛苦。

【讨论】:

  • 有趣的是这些东西是如何分组的。 This question 显示完全相同的问题。
【解决方案2】:

我不确定在 foreign 中声明错误是否公平。考虑一下:

library(dplyr)

df <- data.frame(x=1:10, y=11:20)
class(df)
# [1] "data.frame"
mode(df$x)              # as expected
# [1] "numeric"
mode(df[,"x"])          # as expected
# [1] "numeric"

dp <- data_frame(x=1:10, y=11:20)
class(dp)
# [1] "tbl_df"     "tbl"        "data.frame"
mode(dp$x)
# [1] "numeric"         # as expected
mode(dp[,"x"])
# [1] "list"            # WTF?!

R 中有很多很多函数使用,例如,mode(my.data.frame[,"mycolumn"]) 来测试数据框中列的模式,但是对于 tbl_df 对象,返回的模式是“列表”。

【讨论】:

  • 我想我认为这个错误不一定是write.dbf() 不能处理所有类型的对象,而是dplyr 正在变得非常广泛使用并且错误消息难以理解。只要他们更改错误消息,我就对功能感到满意。
  • 嗯,这有点哲学,但 IMO 的问题在于 dplyr。当测试列的模式时,所谓的“data_frame”返回“list”这一事实是 IMO 不合情理的。它破坏了大量函数/包中的代码。
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 2015-10-14
  • 1970-01-01
  • 2015-09-26
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多