Не правильно читать данные? - PullRequest
2 голосов
/ 28 сентября 2010

Мне кажется, я не задаю правильный вопрос для начала.

Новый вопрос: У меня есть 1,5-гигабайтный файл TSV. Он имеет 6 строк мусора вверху и одну строку мусора внизу, и все это я хочу удалить, не открывая файл. Строка 7 - заголовки. У меня 13 заголовков. Количество рядов неизвестно.

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


Оригинальный вопрос:

Привет

У меня такое чувство, что это действительно легко. Я просто что-то упускаю.

У меня есть текстовый файл, разделенный табуляцией, с 6 строками мусора вверху и строкой барахла в самом низу. Между барахлом у меня есть данные формы Label1 Label2 Label3 Label4 .... Label13 текстовый идентификационный номер процент .... число

Вот что я ввожу в R:

datadump <- read.delim2("truncate.txt", header=TRUE, skip="6")

cleandata <- datadump[c(-dim(datadump)[1]),]

avgposition <- cleandata$Avg.Position

hist(avgposition)

Avg.Position - label13 и номер формы #. #

Все же я получаю ошибку: Ошибка в hist.default (avgposition): 'x' должно быть числовым

Почему данные не воспринимаются как числовые?

Спасибо!

По запросу вот некоторые данные:

> dput(cleandata)
structure(list(Account = structure(c(2L, 2L), .Label = c("Crap1", 
"XXS"), class = "factor"), Campaign = structure(c(1L, 1L), .Label = c("3098012", 
"Crap2"), class = "factor"), Customer.Id = structure(c(2L, 2L
), .Label = c("", "nontech broad (7)"), class = "factor"), Ad.Group = structure(c(2L, 
2L), .Label = c("", "RR 236 (300)"), class = "factor"), Keyword = structure(2:3, .Label = c("", 
"chagall pro", "matisse"), class = "factor"), Keyword.Matching = structure(c(2L, 
2L), .Label = c("", "Broad"), class = "factor"), Impressions = c(4L, 
16L), Clicks = c(1L, 1L), CTR = structure(2:3, .Label = c("", 
"25.00%", "6.25%"), class = "factor"), Avg.CPC = structure(2:3, .Label = c("", 
"$0.05 ", "$0.11 "), class = "factor"), Avg.CPM = structure(2:3, .Label = c("", 
"$12.50 ", "$6.88 "), class = "factor"), Cost = structure(2:3, .Label = c("", 
"$0.05 ", "$0.11 "), class = "factor"), Avg.Position = structure(2:3, .Label = c("", 
"3", "3.1"), class = "factor")), .Names = c("Account", "Campaign", 
"Customer.Id", "Ad.Group", "Keyword", "Keyword.Matching", "Impressions", 
"Clicks", "CTR", "Avg.CPC", "Avg.CPM", "Cost", "Avg.Position"
), row.names = 1:2, class = "data.frame")

Ответы [ 4 ]

2 голосов
/ 28 сентября 2010

Ситуация, очевидно, для вас довольно беспорядочная, отчасти из-за большого размера ваших данных. С размером, который вы сообщаете, вы действительно должны сделать один из следующих вариантов:

  • вы изменили масштаб своей проблемы, поэтому вам не нужно загружать полный набор данных
  • вы используете методы, доступные в R для огромных наборов данных.
  • Вы покупаете 64-битную систему с оперативной памятью 12 ГБ и устанавливаете достаточно большую память R.

Если вы выберете последний вариант, вам может быть полезно посмотреть презентацию Розарио в группе R Users из Лос-Анджелеса в этом году. См. Также главную страницу здесь для примера кода и тому подобное.

При этом для очень запутанных данных я использую немного другое решение, а именно комбинацию readLines() и textConnection(). С первым я попадаю в файл данных как вектор строк. Это позволяет мне сканировать все строки на предмет неудобных вещей, часто используя регулярные выражения. Я также могу очень легко выбрать любой набор строк для чтения. textConnection() затем позволяет мне использовать этот вектор линий в пределах read.table(), read.delim(), ... Например:

Lines <- readLines(somefile.txt)
Lines <- Lines[seq(2,100,by=2)] # selects every second line

xx <- textConnection(Lines)
Data <- read.table(xx,header=T)
close(xx)

Не имея ваших фактических данных, вам трудно провести весь процесс. Имейте в виду, что сказано в других ответах, все это действительно.

2 голосов
/ 28 сентября 2010

Это часто случается со мной, когда мне приходится извлекать из моих коллег грязные файлы Excel. В основном я получаю пустые "" символы в кадре данных. Обычно я просто исправляю это, перекодируя их в NA, а затем повторяю, что они будут в числовом формате.

df[df==""] <- NA  ## Recodes all "" as NA
df$Avg.Position <- as.numeric(df$Avg.Position)
df$some.other.var <- as.numeric(df$some.other.var)

Если у вас есть другие строки в Avg.Position, вам придется их искать и уничтожать. Не используйте as.numeric () для замены до тех пор, пока вы НЕ УВЕРЕНЫ, что все странное исчезло. Странные вещи могут случиться с вашими данными, если вы этого не сделаете.

В качестве альтернативы вы можете сделать это прямо в начале:

datadump <- read.delim2("truncate.txt", na.strings=c("NA",""), header=TRUE, skip="6", )

na.strings=c("NA","") сообщает read.table, что "NA" и "" - это == NA, вы также можете использовать это для преобразования другого "мусора" в NA.

Вы также можете использовать nrows = SOME_NUMBER, если вы знаете, сколько строк существует до самого конца файла с ненужной строкой.

Возможно, вы захотите избавиться и от знаков $, поскольку они приводят к тому, что ваша Avg.CPC / CPM / Cost преобразуется в факторы, а также требует времени и памяти. Там может быть способ сделать это из вашего источника. (Выглядит как загрузка из программного обеспечения для веб-аналитики, но я не могу сказать, какое именно - я давно занимался веб-аналитикой)

2 голосов
/ 28 сентября 2010

Он видит столбец не числовым, если он содержит что-то кроме чисел и NA.Вы либо ошиблись в фактическом столбце, либо в столбце есть мусор, который необходимо очистить.

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

cleandata$Avg.Position <- as.numeric(levels(cleandata$Avg.Position)[cleandata$Avg.Position])

Вы можете определить, какой тип нужно преобразовать, с помощью

str(datadump)
0 голосов
/ 28 сентября 2010

Вы используете read.delim2, где десятичный разделитель по умолчанию равен ,, но десятичный разделитель в ваших данных равен ..Попробуйте использовать read.delim и не забудьте указать na.strings аргумент как Брэндон Бертельсен заявляет .

И если это файл 1,5 ГБ, вы можете рассмотреть рекомендации в ?read.table о comment.char параметр:

comment.char: символ: символьный вектор длиной один, содержащий один символ или пустую строку. Используйте "" ", чтобы отключить интерпретацию комментариев

, поэтому используйте read.delim(some_others_settings, comment.char="").

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