Вопрос по dataframe, r – Почему я получаю X. в именах моих столбцов при чтении фрейма данных?

48

Я спросилвопрос об этом несколько месяцев назади я подумал, что ответ решил мою проблему, но я снова столкнулся с проблемой, и решение не сработало для меня.

Я импортирую CSV:

orders <- read.csv("<file_location>", sep=",", header=T, check.names = FALSE)

Вот структура кадра данных:

str(orders)

'data.frame':   3331575 obs. of  2 variables:
 $ OrderID  : num  -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ...
 $ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ...

Если я бегуlength Команда в первом столбце OrderID, я получаю это:

length(orders$OrderID)
[1] 0

Если я бегуlength на OrderDate возвращает правильно:

length(orders$OrderDate)
[1] 3331575

Это копия / вставкаhead изCSV.

OrderID,OrderDate
-2034590217,2011-10-14
-2034590216,2011-10-14
-2031892773,2011-10-24
-2031892767,2011-10-21
-2021008573,2011-12-08
-2021008572,2011-12-07
-2021008571,2011-12-07
-2021008570,2011-12-07
-2021008569,2011-12-07

Теперь, если я перезапущуread.csv, но вынутьcheck.names вариант, первый столбецdataframe теперь имеет X. в начале названия.

orders2 <- read.csv("<file_location>", sep=",", header=T)

str(orders2)

'data.frame':   3331575 obs. of  2 variables:
 $ X.OrderID: num  -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ...
 $ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ...

length(orders$X.OrderID)
[1] 3331575

Это работает правильно.

Мой вопрос почемуR добавить X. к началу имени первого столбца? Как видно из файла CSV, специальных символов нет. Это должна быть простая загрузка. Добавлениеcheck.names, в то время как импортирует имя из CSV, приведет к неправильной загрузке данных, чтобы я мог выполнить анализ.

Что я могу сделать, чтобы это исправить?

Примечание: я понимаю, что это незначительно - я просто более разочарован тем фактом, что я думаю, что загружаюсь правильно, но не получаю ожидаемого результата. Я мог бы переименовать столбец, используяcolnames(orders)[1] <- "OrderID", но все еще хочу знать, почему он не загружается правильно.

Можете ли вы вырезать и вставить следующие выводы:head(orders) & Амп;head(orders2)? Tyler Rinker
Error: User Rate Limit Exceededcheck.names=FALSE) или запуск изменения имени (с помощьюcheck.names=TRUEError: User Rate Limit Exceededdput(names(orders)[1]) дать? Кроме того, еслиlength(orders[[1]])Error: User Rate Limit Exceeded Brian Diggs
Я не получаю количество заказов, но затемlength(orders$OrderID) [1]0 Tyler Rinker
Мне более любопытно увидеть фактический необработанный CSV-файл. Можете ли вы опубликовать это где-нибудь и предоставить ссылку, чтобы мы могли скачать ее и попытаться воспроизвести это поведение. Какова бы ни была проблема, я предполагаю, что ответ заключается в точной структуре и содержимом файла. joran

Ваш Ответ

4   ответа
2

Error: User Rate Limit Exceeded
66

read.csv()Error: User Rate Limit Exceededread.table() функция. Эта последняя функция имеет аргументcheck.names который задокументирован как:

TRUE’ then the names of the variables in the
         data frame are checked to ensure that they are syntactically
         valid variable names.  If necessary they are adjusted (by
         ‘make.names’) so that they are, and also to ensure that there
         are no duplicates.

Если ваш заголовок содержит метки, которые не являются синтаксически действительными, тоmake.names() заменит их действительным именем, основываясь на неверном имени, удалив недопустимые символы и, возможно, добавивX:

R> make.names("$Foo")
[1] "X.Foo"

Это задокументировано в?make.names:

Details:

    A syntactically valid name consists of letters, numbers and the
    dot or underline characters and starts with a letter or the dot
    not followed by a number.  Names such as ‘".2way"’ are not valid,
    and neither are the reserved words.

    The definition of a _letter_ depends on the current locale, but
    only ASCII digits are considered to be digits.

    The character ‘"X"’ is prepended if necessary.  All invalid
    characters are translated to ‘"."’.  A missing value is translated
    to ‘"NA"’.  Names which match R keywords have a dot appended to
    them.  Duplicated values are altered by ‘make.unique’.

Поведение, которое вы видите, полностью соответствует документированному способуread.table() загружает в ваши данные. Это предполагает, что у вас есть синтаксически недопустимые метки в строке заголовка вашего CSV-файла. Обратите внимание на точку выше из?make.namesError: User Rate Limit Exceeded

Я бы посмотрел на файл CSV и определил любые не-ASCII символы в строке заголовка; возможно, есть невидимые символы (или escape-последовательности;\tError: User Rate Limit Exceededcheck.namesError: User Rate Limit Exceeded

Опубликовать выводsessionInfo() также было бы полезно.

Error: User Rate Limit ExceededX?
Error: User Rate Limit Exceededmake.names(" Foo")Error: User Rate Limit Exceeded"X.Foo"Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcheck.names=FALSE
7

Correct_Colnames <- function(df) {

 delete.columns <- grep("(^X$)|(^X\\.)(\\d+)($)", colnames(df), perl=T)

  if (length(delete.columns) > 0) {

   row.names(df) <- as.character(df[, grep("^X$", colnames(df))])
   #other data types might apply than character or 
   #introduction of a new separate column might be suitable

   df <- df[,-delete.columns]

   colnames(df) <- gsub("^X", "",  colnames(df))
   #X might be replaced by different characters, instead of being deleted
  }

  return(df)
}
10

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

Итак, "3_in" стал & quot; X3_in & quot; так далее... Я решил, переключив ярлык на «in_3» и проблемы были решены.

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Похожие вопросы