Быстро импортируйте несколько текстовых файлов, обрабатывайте пустые строки и включайте имя файла в таблицу в R - PullRequest
0 голосов
/ 06 мая 2019

Я хочу рассчитать среднее количество лайков и акций на пользователя. В настоящее время я пытаюсь сделать это, импортировав все данные в R, а затем рассчитать - если у вас есть другие подходы, я с удовольствием попробую их.

У меня 40 000 текстовых файлов. Каждый текстовый файл представляет пользователя, включая каждое сообщение, его лайки и публикации, например,

file        Text               likes      shares
user1.txt   exampletext 1      13         5
            exampletext 2      1          0
user2.txt   othertext1         192        0
            othertext2         11         18
            othertext2         77         5
...
  • Разделитель столбцов - это «;», каждая новая запись / строка данных закрывается на «/ n».
  • Некоторые текстовые файлы пусты
  • Мне не нужен текст, только лайки и публикации - если это поможет

Я попробовал два способа (оба из stackoverflow, спасибо!):

setwd('path')
filelist <- list.files()
res <- rbindlist(lapply(dir(pattern = "\\.txt"), fread))

-> быстро, но не может обрабатывать пустые строки и помечает записи строк именем файла. Если у меня нет имени файла, я не могу получить средние лайки и акции на пользователя.

setwd('path')
filelist <- list.files()

Results <-  NULL
for (i in filelist){
  i.file <- tryCatch(fread(i,colClasses="NULL", nThread = 4), error=function(e) e)

  if(!class(i.file)[1]=="data.table"){
    i.file <- data.table(cbind(txt.file=i,is.empty="YES",
                               message=i.file$message))
  } else if(nrow(i.file)==0){
    i.file <- data.table(cbind(txt.file=i,is.empty="YES",
                               message=NA))
  } else {
    i.file[,txt.file:=i]
    i.file[,is.empty:="No"]
  }
  Results <- rbind(Results,i.file,fill=TRUE)
  rm(i.file);gc()
}

-> работает, но очень медленно и займет недели, чтобы закончить.

Кто-нибудь может помочь? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...