Zbieram dane z 4 df i chcę je scalić przez rownames. Szukam skutecznego sposobu, aby to zrobić. To jest uproszczona wersja danych, które mam.Scalanie więcej niż 2 ramek danych w R przez 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)
To co bym normalnie zrobić:
# 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
Jak widać, to wymaga dużo kodu. Moje pytanie brzmi, czy ten sam rezultat można osiągnąć za pomocą prostszych środków. Próbowałem (bez powodzenia): AKTUALIZACJA: działa to teraz!
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))
Dzięki z góry za wszelkie sugestie
Co dokładnie masz na myśli przez 'bez success'? Dokładniej opisz błędy, jeszcze lepiej stwórz powtarzalny przykład: –
1.) Jeśli nazwy rzędów są tak ważne dla twojej struktury danych że połączysz się z nimi, dlaczego po prostu nie poświęcisz kolumny "data.frame" na to? Który pozwala zaoszczędzić większość kodu. 2.) Nawet jeśli je zachowasz, możesz zaoszczędzić sporo kodu, zobacz parametry "scal" 'by.x' i' by.y' 3.) Usunięcie kolumny z danych.frame można uzyskać za pomocą 'df $ Row.Names <- NULL' 4.) Podejście "Reduce" powinno zadziałać, zastanawiam się także, dlaczego to się nie uda. – Beasterfield
Podałem kilka przykładowych danych. Odkryłem także, że sugerowane podejście z działa mimo wszystko. Problem polegał na tym, że chciałem scalić pojedynczą kolumnę z pliku df, usuwając w ten sposób informacje rowname. –
HDR