Questo è venuto solo in una risposta ad un'altra domanda qui. Quando si rbind
due frame di dati, esso corrisponde colonne in base al nome, piuttosto che di indice, che può portare a un comportamento imprevisto:Il modo più semplice per ottenere da rbind di ignorare i nomi delle colonne
> df<-data.frame(x=1:2,y=3:4)
> df
x y
1 1 3
2 2 4
> rbind(df,df[,2:1])
x y
1 1 3
2 2 4
3 1 3
4 2 4
Naturalmente, ci sono soluzioni alternative. Per esempio:
rbind(df,rename(df[,2:1],names(df)))
data.frame(rbind(as.matrix(df),as.matrix(df[,2:1])))
su Edit: rename
dal pacchetto plyr
in realtà non funziona in questo modo (anche se ho pensato che avevo a lavorare quando ho originariamente scritto questo ...). Il modo per farlo rinominando è quello di utilizzare la soluzione di SimonO101:
rbind(df,setNames(df[,2:1],names(df)))
Inoltre, forse sorprendentemente,
data.frame(rbindlist(list(df,df[,2:1])))
opere di indice (e se non ci importa una tabella di dati, quindi è piuttosto conciso), quindi questa è una differenza tra do.call(rbind)
.
La domanda è, qual è il modo più conciso per rbind
due frame di dati in cui i nomi non corrispondono? So che questo sembra banale, ma questo genere di cose può finire per ingombrare il codice. E non voglio dover scrivere una nuova funzione chiamata rbindByIndex
. Idealmente sarebbe qualcosa come rbind(df,df[,2:1],byIndex=T)
.
Interessante. Sebbene personalmente preferirei che 'rbind' sui dataframes si occupino di far corrispondere i sottoinsiemi denominati (cioè le colonne). Quando non vuoi "tracciare" le cose per nome, usa 'matrix' in primo luogo? –
Uno (forse l'unico) motivo per non utilizzare 'matrix' è perché non consente il mix di tipi. – mrip