ho raccogliere dati da 4 DF e vorrebbero unirle per rownames. Sto cercando un modo efficace per farlo. Questa è una versione semplificata dei dati che ho.Unione di più di 2 dataframes in R da rownames
df1 <- data.frame(N= sample(seq(9, 27, 0.5), 40, replace= T),
P= sample(seq(0.3, 4, 0.1), 40, replace= T),
C= sample(seq(400, 500, 1), 40, replace= T))
df2 <- data.frame(origin= sample(c("A", "B", "C", "D", "E"), 40,
replace= T),
foo1= sample(c(T, F), 40, replace= T),
X= sample(seq(145600, 148300, 100), 40, replace= T),
Y= sample(seq(349800, 398600, 100), 40, replace= T))
df3 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
df4 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
rownames(df1) <- paste("P", sprintf("%02d", c(1:40)), sep= "")
rownames(df2) <- rownames(df1)
rownames(df3) <- rownames(df1)
rownames(df4) <- rownames(df1)
Questo è quello che normalmente fare:
# merge df1 and df2
dat <- merge(df1, df2, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
# merge dat and df3
dat <- merge(dat, df3, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
# merge dat and df4
dat <- merge(dat, df4, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
Come si può vedere, questo richiede un sacco di codice. La mia domanda è se lo stesso risultato può essere raggiunto con mezzi più semplici. Ho provato (senza successo): AGGIORNAMENTO: funziona ora!
MyMerge <- function(x, y){
df <- merge(x, y, by= "row.names", all.x= F, all.y= F)
rownames(df) <- df$Row.names
df$Row.names <- NULL
return(df)
}
dat <- Reduce(MyMerge, list(df1, df2, df3, df4))
Grazie in anticipo per qualsiasi suggerimento
Che cosa esattamente cosa si intende per 'senza Success'? si prega di essere più specifico, contenere errori. ancora meglio, creare un esempio riproducibile. –
1.) Se i nomi di fila sono sono così importanti per la vostra struc dati certo, che ti unisci da quelli, perché non passi semplicemente a 'data.frame' una vera colonna per questo? Il che ti risparmia gran parte della codifica. 2.) Anche se li mantieni puoi risparmiare un sacco di codice, vedi 'unire' parametri' by.x' e 'by.y' 3.) La rimozione di una colonna da un data.frame può essere ottenuta con' df $ Row.Names <- NULL' 4.) L'approccio 'Reduce' dovrebbe funzionare, mi sto chiedendo anche perché questo fallirebbe. – Beasterfield
Ho incluso alcuni dati di esempio. Ho anche scoperto che l'approccio suggerito con funziona dopo tutto. Il problema era che volevo unire una singola colonna da un df, rimuovendo così le informazioni sui giocatori. –
HDR