Обработка больших данных с помощью ff

Я работаю с набором данных 16Gb. Это, конечно, слишком велико для загрузки в оперативную память, поэтому мне нужно использовать какой-то метод обработки больших данных в R. Мой набор данных состоит из множества переменных, и большинство из них являются символьными переменными, такими как имена и адреса. Я хочу выполнять очистку/редактирование данных, например создавать новые переменные на основе существующих и геокодировать адреса. Я пробовал работать с пакетом 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

Мои вопросы:

  1. Прежде всего, ff пакет для использования в моем состоянии, много символьных переменных в больших данных?

  2. Если это так, как загрузить мой файл в правильный файл ff? (Что делать, например, с first.rows или colClasses)

  3. Какие операции можно выполнять с файлами ff, чем они отличаются от операций, которые вы будете использовать с обычным фреймом данных?

  4. Где найти понятное руководство/пошаговое руководство по пакету ff Я видел некоторые, но они очень технические, и я не мог их пройти.

На заметку: я попытался удалить ненужные переменные, используя требование colClasses, следующим образом:

#Delete the unnecessary variables:
headclasses[c(1,2)]= "NULL"

Однако я получил следующую ошибку:

Ошибка в repname(colClasses, colnames(x), по умолчанию = NA): следующие имена аргументов не совпадают

Это могло бы работать быстрее, если бы я мог немедленно удалить ненужные переменные в моем реальном наборе данных. Итак, как мне это сделать?


r ff
person Boaz Kaarsemaker    schedule 26.11.2017    source источник
comment
Посмотрите здесь и попытайтесь привести воспроизводимый пример.   -  person Christoph    schedule 26.11.2017
comment
Я попытался привести воспроизводимый пример в моем последнем редактировании @Christoph   -  person Boaz Kaarsemaker    schedule 26.11.2017
comment
Это может вам помочь: stackoverflow.com/questions/1727772/   -  person PKumar    schedule 01.12.2017


Ответы (1)


Поскольку размер вашего файла «огромный», я бы рекомендовал сохранить этот файл в БД (например, SQLite), а затем обработайте его с помощью пакета RSQLite. Другим вариантом может быть использование RHadoop непосредственно в файле, хранящемся в hdfs.


Вы также можете прочитать большой файл, используя 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, вы можете обратиться к эту презентацию, которая доступна на официальном сайте.

person 1.618    schedule 30.11.2017