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

Как исправить пробелы в именах столбцов data.frame (удалить пробелы, ввести точки)?

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

Есть ли лучший способ сделать это, а затем использовать преобразование, а затем удалить дополнительный столбец, созданный этой командой?

Это то, что я использую сейчас:

names(ctm2)
#tranform function does this, but requires some action
ctm2<-transform(ctm2,dymmyvar=1)
#remove dummy column
ctm2$dymmyvar <- NULL
names(ctm2)
4b9b3361

Ответ 1

лучшее решение, которое я нашел до сих пор

names(ctm2) %<>% stringr::str_replace_all("\\s","_") %>% tolower

кредит отправляется комментаторам и другим ответам

Ответ 2

Для этой цели существует более элегантное и общее решение:

tidy.name.vector <- make.names(name.vector, unique=TRUE)

make.names() делает синтаксически допустимые имена из векторов символов. Синтаксически действительное имя состоит из букв, цифр и символов точки или подчеркивания и начинается с буквы или точки, за которой не следует число.

Кроме того, флаг unique=TRUE позволяет избежать возможных дубликатов в именах новых столбцов.

В качестве кода для реализации

d<-read_delim(urltxt,delim='\t',)
names(d)<-make.names(names(d),unique = TRUE)

Ответ 3

Чтобы заменить только первое место в каждом столбце, вы также можете:

names(ctm2) <- sub(" ", ".", names(ctm2))

или заменить все пробелы (кажется, это было бы немного более полезно):

names(ctm2) <- gsub(" ", "_", names(ctm2))

или, как упоминалось в первом ответе (хотя и не так, чтобы исправить все пробелы):

spaceless <- function(x) {colnames(x) <- gsub(" ", "_", colnames(x));x}
newDF <- spaceless(ctm2)

где x - имя вашего data.frame. Я предпочитаю использовать "_", чтобы избежать проблем с ".". как часть идентификатора.

Дело в том, что gsub не останавливается в первом экземпляре соответствия шаблона.

Ответ 4

Для этого есть очень полезный пакет, называемый janitor который упрощает очистку имен столбцов. Он удаляет все уникальные символы и заменяет пробелы _.

library(janitor)

#can be done by simply
ctm2 <- clean_names(ctm2)

#or piping through 'dplyr'
ctm2 <- ctm2 %>%
        clean_names()

Ответ 5

Назначьте имена следующим образом. Это лучше всего работает. Он заменяет все пробелы в имени символом подчеркивания.

names(ctm2)<-gsub("\\s","_",names(ctm2))

Ответ 6

dplyr::select_all() может использоваться для переформатирования имен столбцов. Этот пример заменяет пробелы и периоды символом подчеркивания и преобразует все в нижний регистр:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

Ответ 7

Просто назначьте names(ctm2):

  names(ctm2) <- c("itsy", "bitsy", "eeny", "meeny")

или с помощью данных:

  names(ctm2) <- paste("myColumn", 1:ncol(ctm2), sep="")

Другая возможность - отредактировать исходный файл...

Ответ 8

Существует простой способ удаления пробелов в именах столбцов в data.table. Вам нужно будет преобразовать ваш фрейм данных в таблицу данных.

setnames(x=DT, old=names(DT), new=gsub(" ","",names(DT)))

Country Code будет преобразован в CountryCode

Ответ 9

В качестве альтернативы вы можете получить те же результаты с пакетом stingr.

names(ctm2)<-names(ctm2)%>% stringr::str_replace_all("\\s","_")

Ответ 10

Вы также можете использовать комбинацию имен make и функций gsub в R.

names(ctm2)<- gsub("\\.","_", make.names(names(ctm2), unique = T))

Выше код будет делать 2 вещи одновременно:

  1. Он создаст уникальные имена для всех столбцов - например, одинаковые имена будут преобразованы в уникальные, например, c ("ab", "ab") будут преобразованы в c ("ab", "ab2")
  2. Он заменит точки на подчеркивания. это становится простым (просто двойной щелчок по имени), когда вы пытаетесь выбрать имя столбца с подчеркиванием по сравнению с именами столбцов с точками. выбрать имена столбцов с точками очень сложно.