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

R- Почему Xs добавляется к именам переменных в моем кадре данных?

Когда я использую функцию read.csv() в R для загрузки данных, я часто обнаруживаю, что X добавлен к именам переменных. Я думаю, что я почти всегда вижу это в первой переменной, но я могу ошибаться.

Сначала я думал, что R может делать это, потому что у меня было место в начале имени переменной - я этого не делаю.

Во-вторых, я где-то читал, что если у вас есть переменная, которая начинается с числа или является очень коротким именем переменной, R будет добавлять X. Имя переменной - это весь текст и длина имени эта переменная составляет 12 символов, поэтому она не короткая.

Теперь это просто раздражение. Я могу переименовать столбец, но он добавляет шаг, хотя и небольшой.

Есть ли способ предотвратить это от изгоев X от проникновения в мой фрейм данных?

Вот мой оригинальный код:

df <- read.csv("/file/location.filecsv", header=T, sep=",")

Вот эта переменная:

str(orders)
'data.frame':   2620276 obs. of  26 variables:
 $ X.OrderDetailID    : Factor w/ 2620193 levels "(2620182 row(s) affected)",..: 105845
4b9b3361

Ответ 1

read.table и read.csv имеют аргумент check.names=, который можно установить на FALSE.

Например, попробуйте с этим входом, состоящим только из заголовка:

> read.csv(text = "a,1,b")
[1] a  X1 b 
<0 rows> (or 0-length row.names)

против

> read.csv(text = "a,1,b", check.names = FALSE)
[1] a 1 b
<0 rows> (or 0-length row.names)

Ответ 2

Это удивительное поведение, но я думаю, что нам нужен воспроизводимый пример. Возможно, у вас есть некоторые невидимые/специальные символы, скрывающиеся в вашем файле?

names(read.csv(textConnection(
"abcdefghijkl, a1,2x")))

ведет себя хорошо. Можете ли вы привести пример в этом направлении, который демонстрирует вашу проблему?

Как описано в другом ответе, check.names=FALSE - это возможное обходное решение. Вы можете поэкспериментировать с make.names, чтобы определить поведение...

Ответ 3

Как сказал Габор, по умолчанию read.csv deafults преобразуют имена в вашей строке заголовка как допустимые имена переменных (используйте check.names = FALSE, чтобы отключить это). Это делается с помощью функции make.names. Страница справки для этой функции объясняет, что представляет собой допустимое имя переменной.

Синтаксически действительное имя состоит из букв, цифр и точки или подчеркивать символы и начинать с буквы или точки не следовать числом. Имена, такие как ".2way", недействительны, и зарезервированные слова.

Список зарезервированных слов находится на странице справки ?reserved.

Другое условие состоит в том, что имя переменной должно быть 10000 символов или меньше, но make.names не сократит его. Поэтому будьте осторожны, чтобы быть действительно многословными с вашими именами переменных.

Вы можете проверить допустимые имена переменных, используя

library(assertive.code)
is_valid_variable_name(x)