Come modificare i nomi delle colonne nel frame di dati in R? [chiuso]


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

Da questo, so che il nome della colonna / variabile "nome" del frame di dati mydat è sostituito da "newname".

La mia domanda è se, voglio farlo con un ciclo in modo da avere qualcosa del tipo:

newname1 newname2 newname3 newname4 e così via, come posso fare?

Questo è ciò che ha funzionato e non ha funzionato:

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

C'è un modo per codificare questo? molte grazie a tutti coloro che potrebbero essere di aiuto. Owusu Isaac


4
Questa domanda sembra fuori tema perché riguarda esclusivamente la programmazione.
gung - Ripristina Monica

Se è necessario rinominare alcuni brutti nomi di variabili (ad esempio, abcde_1_1, abcde_2_2, abcde_3_3 ...) come spesso accade in alcuni set di dati scaricati da Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

Risposte:


10

La soluzione più ovvia sarebbe quella di cambiare il codice in for loop con il seguente:

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

Ma devi chiarire qual è la tua variabile name. Al momento questo loop farà 4 rinominazioni della singola colonna.

In generale, se i nomi che si desidera modificare sono in vettoriale, questa è una procedura di subsetting standard:

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes

Ciao Mpiktas, la tua soluzione funziona in modo eccellente. grazie molto. e grazie anche a tutti
Figlio,

1
@Owusu, l'espressione di gratitudine in questo sito è la votazione delle risposte e la loro accettazione. Vedi le domande frequenti . Ad ogni modo, felice di essere utile.
mpiktas,

6

Prova a usare sprintfo paste, in questo modo:

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

Inoltre, si noti che names(mydat)[c(name)]è un'assurdità più o meno; c(name)equivale a scrivere giusto namee significa "ottenere il valore della variabile chiamata name"; parentesi estrarrà almeno elementi di names(mydat)ma solo se la namevariabile contiene un indice numerico o booleano.

Se vuoi sostituire le colonne chiamate namecon name1, name2, ..., nameN, usa qualcosa del genere:

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

EDIT: Beh, se vuoi solo rimuovere i nomi delle colonne duplicate, c'è un modo ancora più semplice; R ha una make.namesfunzione che risolve questo problema; può essere usato in questo modo:

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

Anche più breve, lo stesso può essere ottenuto solo scrivendo:

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

@mbq, == la corrispondenza parziale per le stringhe?
mpiktas,

@mpiktas No, ma qui è necessaria solo la corrispondenza esatta. greplsarebbe OK per fare il lavoro più generale.

@mbq, sì ma ciò presuppone che ci siano più colonne con lo stesso nome. R lo consente, ma cerco di evitare di usare questa funzione.
mpiktas,

@mpiktas Apparentemente anche l'OP, quindi questa domanda.

@mbq grazie per aver chiarito la confusione con i nomi (mydat) [c (nome)] Dato che l'OP ha scritto, so che la colonna / nome della variabile "nome" ero tipo "wow, è possibile?" e ho provato ad accedere ai nomi per nome ... stupido;). Posso suggerire umilmente di modificare la domanda?
Steffen,

5

Ho avuto lo stesso problema e l'ho risolto con questo codice:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.