Резюме
Я пытаюсь читать данные твиттера с помощью read.table
. Но у меня есть строки, оканчивающиеся только на \r
, что вызывает проблемы, поэтому я хотел бы пропустить некоторые строки.
Формат данных
Данные представлены в формате CSV, разделенном табуляцией, и имеют следующую форму:
id \t userid \t date \t latitude \t longitude \t location \t tweet \r\n
(Примечание: я добавил пробелы для удобства чтения, а \t
, \r
и \n
соответствуют ожидаемым TAB, CR и LF)
Вот несколько примеров:
488397447040086017 1220042672 20140713190000 -22.923528 -43.238966 Rio de Janeiro, Rio de Janeiro os moradores da minha rua devem me odiar
488397446960381952 1960969112 20140713190000 60.998575 68.998468 Ханты-Мансийск, Ханты-Мансийск Вот интересом, мне одной пофиг на футбол?
488397446997762049 1449959828 20140713190000 32.777693 -97.307257 Fort Worth, TX Buena suerte Argentina
Чтение данных
Были некоторые проблемы (#
как комментарии, '
как символ кавычки, кодировка, ...), которые я уже частично решил:
readTweets <- function(fileName) {
# read tweets from file
tweets <- read.table(fileName, sep = "\t", quote = "", comment.char = "",
col.names = c("id", "user", "date", "latitude",
"longitude", "location", "tweet"),
colClasses = c("numeric", "numeric", "character",
"double", "double", "character",
"character"), encoding = "utf8")
tweets
}
Как вы можете легко видеть, я также добавил параметр colClasses
, чтобы дать полям некоторые полезные типы (я также изменил столбец даты на POSIXct
, но мне нужно выполнить форматирование самостоятельно - побочный квест: есть ли способ применить функции к импортированным столбцам автоматически?).
Ошибка
Это сработало на небольшом тестовом наборе, подобном приведенному выше. Однако, когда я попытался загрузить больший набор данных, я получил следующую ошибку:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
scan() expected 'a real', got '(:'
Небольшой поиск в файле показывает следующую запись:
488397464438071297 403662206 20140713190004 19.320504 -76.426316 @Toneishe_Lovee @purifiedhoran
(:
Похоже, что новая строка находится не в том месте! Сейчас это огромная проблема, как я могу сказать, что строка - это новая строка или нет? А почему так? Я решил взглянуть более подробно и выяснил (снова добавлены пробелы, теперь вы понимаете, почему я опубликовал формат точнее), используя опцию Показать все символы в Notepad ++, как на самом деле выглядит запись:
488397464438071297 \t 403662206 \t 20140713190004 \t 19.320504 \t -76.426316 \t @Toneishe_Lovee @purifiedhoran \r (: \r\n
Обратите внимание на CR
перед смайликом.
Простое решение
Я каким-то образом решил эту проблему, прочитав первый столбец как символы, заполнив строки и установив пустые поля на NA
, а затем используя complete.cases
:
readTweets <- function(fileName) {
# read tweets from file
tweets <- read.table(fileName, sep = "\t", quote = "", comment.char = "",
col.names = c("id", "user", "date", "latitude",
"longitude", "location", "tweet"),
colClasses = c("character", "numeric", "character",
"double", "double", "character",
"character"), encoding = "utf8",
fill = TRUE, na.strings = TRUE)
# remove incorrect rows and convert id to numeric
tweets <- tweets[complete.cases(tweets[,c("id", "user", "date")]),]
tweets$id <- as.numeric(tweets$id)
rownames(tweets) <- NULL
tweets
}
Я все еще задаюсь вопросом, можно ли вообще вводить CR в твиттер или человек, который дал мне файлы csv, просто испортил формат.
Профессиональное решение
Можно ли пропустить неполные строки (без повторной обработки всех данных), чтобы я мог напрямую использовать числовое значение colClass для идентификатора?
ОС / Файл / и т. Д.
В соответствии с просьбой в комментариях, здесь есть дополнительная техническая информация:
- Платформа $: x86_64-w64-mingw32
- $ system: x86_64, mingw32
- $ svn rev: 66115
- $ version.string: R версия 3.1.1 (10.07.2014)
- ОС: Windows 8 (я не ожидал, что R будет работать с моей установкой mingw)
Пример файла:
- Загрузить, 788 B, csv (разделены табуляцией), содержит 5 твитов, включая ошибочный (секунда)
- Формат файла - UTF-8 без спецификации, Notepad ++ определяет окончания строк как Dos \ Windows