使用ffdf读取csv文件并成功对其进行子集化

时间:2012-09-14 00:15:19

标签: r csv dataframe large-files subset

我一直在研究一种使用R从大型csv数据集中有效提取信息的方法。很多人似乎都推荐使用包ff。我成功地阅读了数据集,但现在遇到问题,试图将其子集化。

最大的数据集包含超过650,000行和1005列。并非所有列都包含相同的数据类型。作为数据框架查看,结构如下所示:

'data.frame':   5 obs. of  1005 variables:
 $ SAMPLING_EVENT_ID      : Factor w/ 5 levels "S6230404","S6252242",..: 2 1 3 4 5
 $ LATITUDE               : num  24.4 24.5 24.5 24.5 24.5
 $ LONGITUDE              : num  -81.9 -81.9 -82 -82 -82
 $ YEAR                   : int  2010 2010 2010 2010 2010
 $ MONTH                  : int  4 3 10 10 10
 $ DAY                    : int  97 88 299 298 300
 $ TIME                   : num  9 10 10 11.58 9.58
 $ COUNTRY                : Factor w/ 1 level "United_States": 1 1 1 1 1
 $ STATE_PROVINCE         : Factor w/ 1 level "Florida": 1 1 1 1 1
 $ COUNT_TYPE             : Factor w/ 2 levels "P21","P22": 2 2 1 1 1
 $ EFFORT_HRS             : num  6 2 7 6 3.5
 $ EFFORT_DISTANCE_KM     : num  48.28 8.05 0 0 0
 $ EFFORT_AREA_HA         : int  0 0 0 0 0
 $ OBSERVER_ID            : Factor w/ 3 levels "obs132426","obs58643",..: 3 2 1 1 1
 $ NUMBER_OBSERVERS       : Factor w/ 2 levels "?","1": 2 1 2 2 2
 $ Zenaida_macroura       : int  0 0 1 0 0

所有其他变量与最后一个变量相似,即各种鸟类。

以下是我用来“成功:读取csv:

的代码
B2010 <- read.table.ffdf (x = NULL, “filePath&Name", nrows = -1, first.rows = 50000, next.rows = 50000)

尝试了解ffdf输出,我输入了命令行,如dim(B2010),str(B2010),ls(B2010)等.dim(B2010)导致适当的行数但只有一列(a每个记录由逗号分隔的值的字符串),并且ls(B2010)输出“[1]”physical“”row.names“”virtual“而不是通常的变量列表。

我不知道如何处理这种类型的输出能够提取说STATE_PROVINCE ==“California”?我如何告诉B2010变量是什么?我想我需要以不同的方式看待这一点,但需要你的一些帮助才能弄明白。

我的最终目标是将一堆csv数据集(因为我每年有一个)进行分组,然后将结果重新组合成各种分析的数据帧。

谢谢, 乔

3 个答案:

答案 0 :(得分:3)

要为ffdf配置子集,请使用ffbase包。 如在

require(ffbase)
x <- subset(B2010, BB2010$STATE_PROVINCE == “California”)

答案 1 :(得分:2)

我终于找到了解决方案,让ffdf变量名称和类型正确读取并可访问子集:

B2010&lt; - read.csv.ffdf(file =“filepath / name”,colClasses = c(“factor”,“numeric”,“numeric”,“integer”,“integer”,“integer”,“ numeric“,rep(”factor“,998)),first.rows = 10000,next.rows = 50000,nrows = -1)

这需要永远阅读,但似乎有效,即我能够创建数据的子集。下一步:将子集保存回“正常”数据帧和/或csv。

答案 2 :(得分:0)

根据?read.table.ffdf的帮助页面,您应该使用read.csv.ffdf(...)。然后转到布兰登引用的页面。