如何将ffdf应用于非原子数据帧?

时间:2013-04-03 12:20:09

标签: r dataframe bigdata

许多帖子(such as this)声称ff包优于bigmemory,因为它可以处理具有原子和非原子组件的对象,但是如何?例如:

UNIT <- c(100,100, 200, 200, 200, 200, 200, 300, 300, 300,300)
STATUS <- c('ACTIVE','INACTIVE','ACTIVE','ACTIVE','INACTIVE','ACTIVE','INACTIVE','ACTIVE',
        'ACTIVE','ACTIVE','INACTIVE') 
TERMINATED <- as.Date(c('1999-07-06','2008-12-05','2000-08-18','2000-08-18','2000-08-18',
                    '2008-08-18','2008-08-18','2006-09-19','2006-09-19','2006-09-19',
                    '1999-03-15')) 
START <- as.Date(c('2007-04-23','2008-12-06','2004-06-01','2007-02-01','2008-04-19',
               '2010-11-29','2010-12-30','2007-10-29','2008-02-05','2008-06-30',
               '2009-02-07'))
STOP <- as.Date(c('2008-12-05','2012-12-31','2007-01-31','2008-04-18','2010-11-28',
              '2010-12-29','2012-12-31','2008-02-04','2008-06-29','2009-02-06',
              '2012-12-31'))
TEST <- data.frame(UNIT,STATUS,TERMINATED,START,STOP)
TEST                   

#install.packages('ff')            
library('ff')            
TEST2 <- ffdf(TEST)            
Error in ffdf(TEST) : ffdf components must be atomic ff objects

我可以做些什么来完成这项工作?

2 个答案:

答案 0 :(得分:5)

使用

TEST2 <- as.ffdf(TEST)   

而不是

TEST2 <- ffdf(TEST)   

会奏效。

说明: as.ffdf将您的data.frame转换为ffdf。 如果您确实想直接使用ffdf,则需要提供原子ff向量,如错误消息所示。对于上面的例子,这将是

ffdf(UNIT = as.ff(UNIT), STATUS = as.ff(as.factor(STATUS)), TERMINATED = as.ff(TERMINATED), START = as.ff(START), STOP = as.ff(STOP))

参见?as.ffdf或?ffdf,ff包的一部分。

在现实生活中,您的数据将来自其他来源,如csv或SQL源,而不是来自R中已有的data.frame。请参阅包ETLUtils,以便轻松地将SQL中的数据转换为ff。

答案 1 :(得分:1)

我试图在调用ff之前将TEST data.frame的列强制转换为ffdf个对象,但这不起作用。这是使用read.csv.ffdf的解决方法:

write.csv(TEST,file='test.csv')
TEST.ffd <- read.csv.ffdf(file='test.csv')