2016-11-25 95 views
-1

我有三個我想加入的數據幀。他們沒有相同的長度,以及如何加入他們其中兩人的回答是here。 我試圖使用join_allplyr,但沒有成功的服裝,因爲它需要'x'範圍從df.a 2-7,並從df.b繞過x值爲1。我很難在join_all的文檔中找到答案。使用來自plyr的join_all加入多個數據幀

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

使用使用Reducemerge'減少(函數(...)合併(...,通過=「 x「,all = TRUE),dfs)' – akrun

+1

據我所見,標記的重複並不表示如何使用join_all來實現。作爲一個結論,它不適合這種特定的操作? – raumkundschafter

+0

是的,你是對的。我認爲這不是一個愚蠢的問題,對我的回答的低估是不公平的 – akrun

回答

0

我們可以在data.frame S的list

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