Я хочу изменить имена столбцов с помощью цикла - PullRequest
2 голосов
/ 02 мая 2020

у меня есть имена столбцов наборов данных, выглядящие так:

state.abb, state.area, state.division, state.region

я хочу изменить имена столбцов и удалить штат." часть, чтобы оставить только "abb", "area", "Division" и "Region". я написал этот код, используя al oop над столбцами df, используя substr fun c, но он не работает и не выдает ошибок. что с ним не так, пожалуйста?


    for(e in 1:ncol(df)){
      colnames(df[e])<-substring(colnames(df[e]),7)
    }

Ответы [ 2 ]

4 голосов
/ 02 мая 2020

В качестве альтернативного решения вы можете использовать gsub() для замены всего «состояния». с ничего (""), здесь показано, что только с вектором:

gsub("state.", "", c("state.abb", "state.area", "state.division", "state.region"))

Чтобы заменить имена столбцов:

colnames(df) <- gsub("state.", "", colnames(df))

В качестве бонуса представьте, что вы хотите заменить слово или строка, которая встречается в некоторых, но не во всех ваших столбцах. Взяв в качестве примера встроенный набор данных радужной оболочки, вы можете заменить «Лепесток» на «Р» для столбцов, где «Лепесток» находится в имени столбца с точно таким же подходом:

colnames(iris) <- gsub("Petal", "P", colnames(iris))

Я бы не стал Для этой работы не нужно использовать для l oop, гораздо проще использовать векторизованный подход. Но, чтобы объяснить вашу ошибку, когда вы сделали colnames(df[1]) , вы возвращали имя столбца отдельного столбца данных, который вы изолировали от основного кадра данных , а не обрабатывали сам основной кадр данных. Например, iris[1] возвращает кадр данных с одним столбцом - см. str(iris[1]) - поэтому colnames(iris[1]) возвращает имя столбца этого изолята. Небольшое изменение позволяет вместо этого вернуть (а затем изменить) 1-й элемент вектора имен столбцов для радужной оболочки: colnames(iris)[1].

4 голосов
/ 02 мая 2020

Здесь мы можем изменить векторизацию colnames(df[e]) на colnames(df)[e]

for(e in seq_along(df)){
     colnames(df)[e] <- substring(colnames(df)[e],7)
}

substring, чтобы мы могли напрямую сделать это без каких-либо for l oop

colnames(df) <- substring(colnames(df), 7)

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

colnames(df) <- sub(".*\\.", "", colnames(df))

An например,

data(mtcars)
colnames(mtcars[1]) <- "hello"
colnames(mtcars[1])
#[1] "mpg" # no change
colnames(mtcars)[1] <- "hello"
colnames(mtcars[1])
#[1] "hello" # changed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...