Избегайте замены пробела в имени столбца точкой (.) при использовании read.csv().

Я использую R для предварительной обработки данных, и вот проблема, с которой я столкнулся: я ввожу данные, используя read.csv(filename,header=TRUE), а затем пробел в именах переменных становится «.», например, переменная с именем Полный код стал Full.Code в сгенерированном кадре данных. После обработки я использую write.xlsx(filename) для экспорта результатов, при этом имена переменных меняются. Как решить эту проблему?

Кроме того, в выходном файле .xlsx первый столбец становится индексом (т. е. от 1 до N), чего я не ожидал.


person zeno tsang    schedule 17.06.2013    source источник
comment
Вы можете избежать необходимости исправлять имена, вызвав read.csv с опцией check.names=FALSE.   -  person Matthew Plourde    schedule 17.06.2013


Ответы (4)


Если вы установили check.names=FALSE в read.csv при чтении данных, то имена не будут изменены, и вам не нужно будет редактировать их перед записью данных обратно. Это, конечно, означает, что вам нужно будет заключать имена столбцов в кавычки (в некоторых случаях в обратные кавычки) или ссылаться на столбцы по местоположению, а не по имени при редактировании.

person Greg Snow    schedule 18.06.2013
comment
Я думаю, что использование check.names=FALSE — лучший выбор, чем редактирование имен столбцов, хотя повторное чтение данных требует от меня много работы. В общем, спасибо за ваш ответ! Это действительно мне очень помогает. - person zeno tsang; 19.06.2013

Чтобы вернуть пробелы в именах, сделайте это (прямо перед экспортом — R позволяет использовать пробелы в именах переменных, но это неудобно):

# A simple regular expression to replace dots with spaces
# This might have unintended consequences, so be sure to check the results
names(yourdata) <- gsub(x = names(yourdata),
                        pattern = "\\.",
                        replacement = " ")

Чтобы удалить индекс первого столбца, просто добавьте row.names = FALSE к вашему write.xlsx(). Это общий аргумент для функций, которые записывают данные в табличном формате (у write.csv() он тоже есть).

person Matt Parker    schedule 17.06.2013
comment
Большое спасибо! Функция gsub() работает нормально. Но у меня все еще есть вопрос: почему мы должны использовать два экранирования, а не просто использовать pattern="\."? - person zeno tsang; 18.06.2013
comment
@zenotsang Хороший вопрос - я не уверен, зачем R это требует. - person Matt Parker; 18.06.2013
comment
Первый экран используется, когда синтаксический анализатор R анализирует строку, это оставляет '\' для регулярного выражения. Если вы обойдете обычный синтаксический анализатор, вы можете обойтись одним обратным слэшем (но это, вероятно, больше работы, чем оно того стоит). - person Greg Snow; 18.06.2013
comment
Я понимаю. Очевидно, что следовать правилам в R лучше :) Большое спасибо! - person zeno tsang; 19.06.2013

Вот функция (извините, я знаю, что она может быть реорганизована), которая делает красивые имена столбцов, даже если есть несколько последовательных точек и точек в конце:

makeColNamesUserFriendly <- function(ds) {
  # FIXME: Repetitive.

  # Convert any number of consecutive dots to a single space.
  names(ds) <- gsub(x = names(ds),
                    pattern = "(\\.)+",
                    replacement = " ")

  # Drop the trailing spaces.
  names(ds) <- gsub(x = names(ds),
                    pattern = "( )+$",
                    replacement = "")
  ds
}

Пример использования:

ds <- makeColNamesUserFriendly(ds)
person Marcin Bilski    schedule 23.08.2014

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

require(“stringr”)   
colnames(data) <- str_replace_all(colnames(data), "[:punct:]", " ")

Например, попробуйте:

data <- data.frame(variable.x = 1:10, variable.y = 21:30, variable.z = "const")

colnames(data) <- str_replace_all(colnames(data), "[:punct:]", " ")

а также

colnames(data)

дам тебе

[1] "variable x" "variable y" "variable z"
person TimTeaFan    schedule 11.06.2018