Подтвердить что ты не робот

X. в моих именах столбцов кадра данных R

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

Я импортирую 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", но все же хочу знать, почему он не загружается правильно.

4b9b3361

Ответ 1

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

check.names: logical.  If ‘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() также будет полезна.

Ответ 2

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

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

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

Ответ 3

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

В моем случае несколько шагов записи и чтения данных выработали один или несколько столбцов с именем "X", X.1 ",... содержащий содержимое в столбцах X-столбца и строки в X.1,... -columns. В моем случае содержимое столбца 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)
}

Ответ 4

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