2016-11-25 4 views
-1

Ich habe drei Datenrahmen, denen ich beitreten möchte. Sie haben nicht die gleiche Länge und wie man zwei von ihnen verbindet wurde beantwortet here. Ich versuchte join_all von plyr von plyr aber kein Kleid für den Erfolg zu verwenden, da es die 'x' im Bereich von 2-7 von df.a dauert und die x-Werte für 1 von df.b überbrückt. Ich habe Mühe, die Antwort in der Dokumentation für join_all zu finden.Verbinden Sie mehrere Datenrahmen mit join_all von plyr

MWE:

library(plyr) 
df.a <- c(5, 4, 5, 7, 3, 5, 6, 5, 5, 4, 5, 5, 4, 5, 4, 7, 2, 4, 4, 5, 3, 6, 5, 6, 4, 4, 5, 4, 5, 5, 6, 7, 4) 
df.b <- c(1, 3, 4, 6, 2, 7, 7, 4, 3, 6, 6, 3, 6, 6, 5, 6, 6, 5) 
df.c <- c(3, 1, 3, 6, 6, 5, 7, 6, 6, 2, 7, 5, 1) 
table(df.a) 
count(df.a) 
df.a.count <- count(df.a) 
df.b.count <- count(df.b) 
df.c.count <- count(df.c) 

#normalize the data 
df.a.count$freq <- sapply(df.a.count$freq, function(X) X/length(df.a)) 
df.b.count$freq <- sapply(df.b.count$freq, function(X) X/length(df.b)) 
df.c.count$freq <- sapply(df.c.count$freq, function(X) X/length(df.c)) 

#solution using merge 
df.m <- merge(df.a.count, df.b.count, by ='x', all=TRUE) 
df.m <- merge(df.m, df.c.count, by ='x', all=TRUE)[2:4] 
names(df.m) <- c('freq.a', 'freq.b','freq.c') 

#problem using join_all 
dfs <- list(df.a.count, df.b.count, df.c.count) 
df.all <- join_all(dfs, 'x') 
+0

Gebrauch verwenden können 'Reduce (function (...) fusionieren (..., by =" x ", all = TRUE), dfs)' – akrun

+1

Soweit ich sehen kann, zeigt das markierte Duplikat nicht an, wie dies mit 'join_all' erreicht werden könnte. Als eine Schlussfolgerung ist es nicht für diese bestimmte Operation geeignet? – raumkundschafter

+0

Ja, Sie haben Recht. Ich denke, es ist kein Betrüger dieser Frage und der Downvote auf meine Antwort ist nicht fair – akrun

Antwort

0

Wir Reduce mit merge auf der list von data.frame s

Reduce(function(...) merge(..., by = "x", all = TRUE), dfs) 
# x  freq.x  freq.y  freq 
#1 1   NA 0.05555556 0.15384615 
#2 2 0.03030303 0.05555556 0.07692308 
#3 3 0.06060606 0.16666667 0.15384615 
#4 4 0.30303030 0.11111111   NA 
#5 5 0.39393939 0.11111111 0.15384615 
#6 6 0.12121212 0.38888889 0.30769231 
#7 7 0.09090909 0.11111111 0.15384615 
Verwandte Themen