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

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

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

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

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

<code>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 ...
</code>

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

<code>length(orders$OrderID)
[1] 0
</code>

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

<code>length(orders$OrderDate)
[1] 3331575
</code>

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

<code>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
</code>

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

<code>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
</code>

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

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

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

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

 joran04 мая 2012 г., 03:21
Мне более любопытно увидеть реальный необработанный CSV-файл. Можете ли вы опубликовать это где-нибудь и предоставить ссылку, чтобы мы могли скачать ее и попытаться воспроизвести это поведение. Какова бы ни была проблема, я предполагаю, что ответ заключается в точной структуре и содержимом файла.
 Tyler Rinker04 мая 2012 г., 04:01
Я не получаю количество заказов, но тогдаlength(orders$OrderID) [1]0
 Brian Diggs04 мая 2012 г., 05:04
Я с @joran; Я предполагаю, что есть невидимый символ в начале файла, который вытягивается в имя столбца (сcheck.names=FALSE) или запуск изменения имени (с помощьюcheck.names=TRUE). К сожалению, простое прошлое CSV, вероятно, не покажет это. Что значитdput(names(orders)[1]) дайте? Кроме того, еслиlength(orders[[1]]) дает правильное значение, тогда вы знаете, что оно в названии.
 Tyler Rinker04 мая 2012 г., 03:19
Можете ли вы вырезать и вставить следующие выходные данные:head(orders) & head(orders2)?

Ответы на вопрос(4)

включив row.names = FALSE в качестве аргумента в функцию write.csv. write.csv включал имена строк в качестве безымянного столбца в файл CSV, а read.csv именовал этот столбец «X» при чтении файла CSV.

 turnip42425 мая 2018 г., 12:41
Спасибо за этот ответ! Я решил похожую ситуацию, основываясь на вашем обходном пути.

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

Так, «3_in» стал «X3_in» и т. Д. Я решил, переключив ярлык на «in_3», и проблемы были решены.

Я надеюсь, что это помогает кому-то

 Ryan Chase01 февр. 2016 г., 02:17
Спасибо Мэтт. Как вы систематически убирали «х». и добавить все столбцы с "in_"?

ми кода, чтобы исправить имена столбцов. Конечно, не идеально, так как чистое программирование на переднем плане было бы лучше, но, возможно, полезно как отправная точка для кого-то, как быстрый и грязный подход. (Мне бы хотелось добавить их в качестве комментария к вопросу Райана / ответу Гэвина, но моя репутация недостаточно высока, поэтому мне пришлось опубликовать дополнительный ответ - извините).

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

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)
}
Решение Вопроса

read.csv() является оберткой вокруг более общегоread.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.names что буква зависит от локали вашей системы; Файл CSV может содержать допустимый символ, который будет отображаться в вашем текстовом редакторе, но если R не работает в той же локали, этот символ может быть недопустимым, например?

Я бы посмотрел на файл CSV и определил любые не-ASCII символы в строке заголовка; возможно, есть невидимые символы (или escape-последовательности;\t?) в строке заголовка тоже. Многое может происходить между чтением в файле с недопустимыми именами и отображением его в консоли, которое может маскировать недопустимые символы, так что не принимайте тот факт, что без @ ничего не отображается неправильcheck.names означает, что файл в порядке.

Размещение выводаsessionInfo() также было бы полезно.

 FatihSarigol07 окт. 2018 г., 14:28
Очень упрощенная сводка этого идеального ответа будет, попробуйте добавить это в вашу read.table (), если вы не хотите, чтобы R изменил ваши имена:check.names=FALSE
 Tyler Rinker04 мая 2012 г., 17:18
Хороший ответ Гэвин +1 Интересно, есть ли пробел перед именем заголовка какmake.names(" Foo") создает"X.Foo" также
 Dan14 сент. 2016 г., 04:59
Можно ли использовать другой символ вместоX?

Ваш ответ на вопрос