Як змінити імена стовпців у кадрі даних на R? [зачинено]


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

З цього я знаю, що ім'я стовпця / змінної "name" кадру даних mydat замінено на "newname".

Моє запитання: якщо я хочу це зробити циклом, щоб у мене з'явилася така річ, як:

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, ваше рішення працює чудово. дуже дякую. і спасибі всім
Син

1
@Owusu, висловлення вдячності на цьому веб-сайті викликає відповіді та їх прийняття. Дивіться Довідку . У будь-якому випадку, радий бути корисним.
mpiktas

6

Спробуйте використовувати sprintfабо paste, як це:

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

Також зауважте, що names(mydat)[c(name)]це більш-менш дурниця; c(name)еквівалентний написанню справедливого nameі означає "отримати значення змінної, що називається name"; дужка буде принаймні витягувати елементи, names(mydat)але тільки якщо nameзмінна містить числовий або булевий індекс.

Якщо ви хочете замінити стовпці , звані nameз name1, name2, ..., nameN, використовувати що - щось на зразок цього:

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

EDIT: Ну, якщо ви просто хочете видалити скопійовані назви стовпців, є ще простіший спосіб; 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) [c (ім'я)] Оскільки в ОП написано, я знаю, що ім'я стовпця / змінної "name" мені було на зразок "вау, що це можливо?" і намагався отримати доступ до імен по імені ... дурний мені;). Чи можу я смиренно запропонувати відредагувати питання?
steffen

5

У мене була така ж проблема, і я вирішив її за допомогою цього коду:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.