Как изменить имена столбцов в кадре данных в R? [закрыто]

9
 names(mydat)[c(name)]<-c("newname") 

Исходя из этого, я знаю, что имя столбца / переменной «имя» фрейма данных mydat заменяется на «новое имя».

Мой вопрос, если я хочу сделать это с помощью цикла, чтобы у меня было что-то вроде:

newname1 newname2 newname3 newname4 и так далее, как мне это сделать?

Это то, что сделал, и это не сработало:

for(i in 1:4){
names(mydat)[c(name)]<-c("newname"i)
}

Есть ли способ закодировать это? Большое спасибо всем, кто мог бы помочь. Овусу Исаак

Сын
источник
4
Этот вопрос, кажется, не по теме, потому что он касается только программирования.
gung - Восстановить Монику
Если вам нужно переименовать некоторые уродливые имена переменных (например, abcde_1_1, abcde_2_2, abcde_3_3 ...), как это часто происходит в некоторых наборах данных, загружаемых из Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

Ответы:

10

Наиболее очевидным решением было бы изменить ваш код для цикла следующим образом:

   names(mydat)[c(name)] <- paste("newname",i,sep="")

Но вам нужно уточнить, что ваша переменная name. На данный момент этот цикл будет делать 4 переименования одного столбца.

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

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes
mpiktas
источник
Здравствуйте, Mpiktas, ваше решение работает отлично. огромное спасибо. и спасибо всем также
Сын
1
@ Owusu, выражение благодарности на этом сайте - голосование за ответы и их принятие. Смотрите FAQ . В любом случае, рад быть полезным.
mpiktas
6

Попробуйте использовать sprintfили paste, как это:

names(mydat)<-sprintf("name%d",1:10)

Также обратите внимание, что names(mydat)[c(name)]это более-менее глупость; c(name)эквивалентно записи just nameи означает «получить значение переменной с именем name»; скобка будет по крайней мере извлекать элементы, names(mydat)но только если nameпеременная содержит числовой или логический индекс.

Если вы хотите заменить столбцы , называемые nameс name1, name2, ..., nameN, использовать что - то вроде этого:

names(mydat)[names(mydat)=="name"]<-sprintf("name%d",1:sum(names(mydat)=="name"))

РЕДАКТИРОВАТЬ: Ну, если вы просто хотите удалить дублированные имена столбцов, есть еще более простой способ; R имеет make.namesфункцию, которая решает эту проблему; это можно использовать так:

names(mydat)<-make.names(names(mydat),unique=TRUE)

Короче, то же самое можно получить, только написав:

data.frame(mydat)->mydat #The magic is in check.names, but it is TRUE by default

источник
@mbq, == частичное совпадение для строк?
mpiktas
@mpiktas Нет, но здесь требуется только точное соответствие. greplбыло бы хорошо, чтобы сделать более общую работу.
@mbq, да, но это предполагает, что есть несколько столбцов с одинаковым именем. R позволяет это, но я стараюсь избегать использования этой функции.
mpiktas
@mpiktas Очевидно, что и ОП, таким образом, этот вопрос.
@mbq спасибо за разъяснение путаницы с названиями (mydat) [с (имя)] Так как OP написал я знаю , что / имя переменной «имя» колонке я был как «ничего себе , что это возможно?» и пытался получить доступ к именам по имени ... тупой меня;). Могу ли я смиренно предложить отредактировать вопрос?
Штеффен
5

У меня была та же проблема, и я решил ее с помощью этого кода:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
Cuong
источник