将 data.frame 转换为 ff
Posted
技术标签:
【中文标题】将 data.frame 转换为 ff【英文标题】:convert data.frame to ff 【发布时间】:2013-06-22 13:05:17 【问题描述】:我想 对象,as.ffdf 如here所述
df.apr=as.data.frame(df.apr) # from data.table to data.frame
cols=df.apr[1,]
cols=sapply(cols,class)
df_apr=as.ffdf(df.apr,vmode=cols)
给出一个错误:
Error in ff(initdata = initdata, length = length, levels = levels, ordered = ordered,
: vmode 'numeric' not implemented
没有 'vmode' 参数,会给出以下错误:
Error in ff(initdata = initdata, length = length, levels = levels, ordered = ordered,
: vmode 'character' not implemented
写到一个表格然后直接读入 ff 是可行的:
write.table(df.apr,file='df_apr.txt',sep='\t',row.names=F)
df.apr.ff=read.table.ffdf(file='df_apr.txt',header=F,VERBOSE=T)
但这很耗时[而且很笨拙]。 有没有更好的办法?
【问题讨论】:
在没有数据的情况下很难帮助你,你能dput(head(df.apr))
吗?你也按照链接中的建议测试了 ffdf(ffdf(col1 = as.ff(col1),...) .. ? 我的意思是@wijffels 的解释
数据来自 GDELT,gdelt.utdallas.edu。这些从 4 月开始的每日更新已经是 +/- 090 万条记录。 Data.table 在这台具有 16 GB RAM 的 linux debian 64 位机器上崩溃了 [RStudio 没有说再见就退出了]。我可以做 dput(head(df.apr)),它给出了我期望的 58 个变量的详细描述。没有尝试 1 by 1 方法,因为解决方法更快/更简单[写入文件并以 ffdf 形式读回]。
【参考方案1】:
如果您想知道可以在 ff 中使用的所有可能的 vmode,请在控制台中键入以下内容。
require(ff)
.vimplemented
您会看到数字和字符模式不在其中。数字转换为双精度数,字符转换为因子。所以在你的问题中,你真的不需要自己指定 vmodes。只要将字符编码为因子,就可以在 data.frame 上使用 as.ffdf。所以这会起作用。
df.apr=as.data.frame(df.apr, stringsAsFactors=TRUE)
df_apr=as.ffdf(df.apr)
仅供参考。如果您的数据来自平面文件,请考虑使用 read.table.ffdf,或者如果它来自 SQL 数据源,您可以使用 ETLUtils 包中的 read.dbi.ffdf 或 read.odbc.ffdf。如果它是通过 Hive 来自 Hadoop,您可以使用 ETLUtils 包中的 read.jdbc.ffdf。
【讨论】:
我希望 ffdf 将很快包含更多模式。有时真的很烦人以上是关于将 data.frame 转换为 ff的主要内容,如果未能解决你的问题,请参考以下文章