我正在使用16Gb的数据集。这个过程太大而无法加载到RAM内存中,所以我需要在R中使用某种bigdata handeling方法。 我的数据集由很多变量组成,其中大多数是字符变量,如名称和地址。 我想做数据清理/编辑,比如根据现有变量创建新变量和地理编码地址。 我尝试过使用ff包但我无法使用它。 首先,我无法将数据集正确地转换为ffdf文件。 第二,当我有点做的时候,我无法按照它在早期常规数据帧上的工作方式进行数据清理。
示例数据集的问题示例:
#create example dataset similar to mine with strings
df2 <- read.table(text='npi dier getal mubilair
51 "aap" een tafel
52 vis twee stoel
53 paard twee zetel
54 kip drie fouton
55 beer vier fouton
56 aap vijf bureau
57 tijger zes bank
58 zebra zeven sofa
59 olifant acht wastafel
60 mens acht spiegel', header=T, sep='')
dfstring <- df2[,-1]
rownames(dfstring) <- df2[,1]
write.csv(dfstring, "~/UC Berkeley/Research/dfstring.csv")
library(ff)
# creating the ff file
headset = read.csv(file="~/UC Berkeley/Research/dfstring.csv", header = TRUE, nrows = 5000)
headclasses = sapply(headset, class)
str(headclasses)
dfstring.ff <- read.csv.ffdf(file="~/UC Berkeley/Research/dfstring.csv", first.rows=5000, colClasses=headclasses)
#doesn't work error:scan() expected 'an integer', got '"51"'
headclasses [c(1)] = "factor"
dfstring.ff <- read.csv.ffdf(file="~/UC Berkeley/Research/dfstring.csv", first.rows=5000, colClasses=headclasses)
dfstring.ff
#set all variables to factor
dfstring.ff$getalmubilair <- paste(dfstring.ff$getal, dfstring.ff$mubilair, sep = ' ')
#doesn't work error: assigned value must be ff
getalmubilair <- paste(dfstring.ff$getal, dfstring.ff$mubilair, sep = ' ')
getalmubilair
#doesn't work creates an empty object
我的问题:
首先是ff在我的条件下使用的包,大数据中的很多字符变量?
如果是这种情况如何将我的文件加载到正确的ff文件中? (例如,如何使用first.rows或colClasses)
可以对ff文件执行哪些操作,它们与常规数据框中的操作有何不同?
哪里可以找到一个可以理解的ff包的手册/演练,我已经看过一些,但它们非常技术性,我无法通过它们。
旁注: 我尝试使用colClasses需求以下列方式删除不必要的变量:
#Delete the unnecessary variables:
headclasses[c(1,2)]= "NULL"
但是,我收到以下错误:
repnam中的错误(colClasses,colnames(x),default = NA):. 以下参数名称不匹配
如果我能够立即删除真实数据集中不必要的变量,它可能会更快。那我该怎么做呢?
答案 0 :(得分:1)
由于您的文件大小是&#34;巨大的&#34;我建议将此文件存储在db(例如SQLite)中,然后使用RSQLite
包处理它。其他选项可以是直接对存储在hdfs中的文件使用RHadoop
。
您还可以通过循环遍历内存中的小块来阅读使用read.table
的大文件。您可以尝试下面的代码段。
chunkSize <- 1000000
testFile <- "testFile.csv"
con <- file(description=testFile, open="r")
#column headers
headers <- strsplit(readLines(testFile,n=1), split=',')[[1]]
df <- read.table(con, nrows=chunkSize, header=T, fill=T, sep=",", col.names = headers)
repeat {
if (nrow(df) == 0)
break
print(head(df))
####
#add code to process chunk data
####
#read next chunk
if (nrow(df) != chunkSize)
break
df <- tryCatch({
read.table(con, nrows=chunkSize, skip=0, header=F, fill=T, sep=",", col.names = headers)
}, error=function(e){
if (identical(conditionMessage(e), "no lines available in input"))
data.frame()
else stop(e)
})
}
close(con)
如果您想阅读有关ff
个套餐的信息,可以参考this在official website上提供的演示文稿。