Как заменить "." в именах столбцов, сгенерированных read.csv() с одним пробелом при экспорте?
Я использую R для предварительной обработки данных, и вот проблема, с которой я столкнулся: я вводил данные с помощью read.csv(filename,header=TRUE)
, а затем пространство в именах переменных становилось ".", например, переменная с именем Full Code стала Full.Code в сгенерированном фрейме. После обработки я использую write.xlsx(filename)
для экспорта результатов, а имена переменных изменены. Как решить эту проблему?
Кроме того, в выходном файле .xlsx первый столбец становится индексом (например, от 1 до N), чего я не ожидаю.
Ответы
Ответ 1
Если ваш набор check.names=FALSE
в read.csv
, когда вы читаете данные, тогда имена не будут изменены, и вам не нужно будет редактировать их перед записью данных. Это, конечно, означает, что вам нужно будет указывать имена столбцов (в некоторых случаях кавычки) или ссылаться на столбцы по местоположению, а не на имя во время редактирования.
Ответ 2
Чтобы получить пробелы в именах, сделайте это (прямо перед экспортом - 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()
тоже).
Ответ 3
Здесь функция (извините, я знаю, что она может быть реорганизована), которая делает хорошие имена столбцов, даже если есть несколько последовательных точек и конечных точек:
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)