2013-10-10 194 views
0

假設我們有兩個數據框,我們想合併它們。在df2各組的值的數量小於或等於值的數量df1如何通過在R中重複使用而不重複來合併兩個不同長度的數據幀?

df1 <- data.frame(group = c(rep("A", 5), rep("B", 4), rep("C", 2)), 
        values = c(51, 13, 18, 89, 3, 27, 86, 85, 31, 100, 55)) 
df2 <- data.frame(group = c(rep("A", 2), rep("B", 2), rep("C", 2)), 
        values = c(30, 36, 50, 60, 45, 70)) 
df.merge <- merge(df1, df2, "group") 

我們得到了這樣的事:

head(df1) 
## group values 
## A  51 
## A  13 
## A  18 
## A  89 
## A  3 
## B  27 

df2 
## group values 
## A  30 
## A  36 
## B  50 
## B  60 
## C  45 
## C  70 

head(df.merge) 
## group values.x values.y 
## A  51  30 
## A  51  36 
## A  13  30 
## A  13  36 
## A  18  30 
## A  18  36 

因此,對於每一個獨特的df2valuedf1中相應組的每一行都是重複的。

我的目的是讓:

## group values.x values.y 
## A  51  30 
## A  13  36 
## A  18  30 
## A  89  36 
## A  3  30 
## B  27  50 
## B  86  60 
## B  85  50 
## B  31  60 
## C  100  45 
## C  55  70 

有任何方便的方式來實現這一目標?

+0

我會很感激被告知爲downvote原因。 – AnjaM

回答

3

這會做到這一點:

library(data.table) 
dt1 = data.table(df1) 
dt2 = data.table(df2) 

setkey(dt2, group) 

dt1[, values.y := dt2[J(.BY[[1]])]$values, by = group] 
dt1 
# group values values.y 
# 1:  A  51  30 
# 2:  A  13  36 
# 3:  A  18  30 
# 4:  A  89  36 
# 5:  A  3  30 
# 6:  B  27  50 
# 7:  B  86  60 
# 8:  B  85  50 
# 9:  B  31  60 
#10:  C 100  45 
#11:  C  55  70 
+1

+1打我的(刪除)答案一分鐘。我很驚訝,沒有給出有關回收的警告。也可以把它寫成'dt1 [,values.y:= dt2 [。(g)] $ values,by = list(g = group)]'...我喜歡看起來更好。 – Frank

+1

@Frank我認爲沒有警告是一個錯誤 – eddi

+1

錯誤報告添加 - https://r-forge.r-project.org/tracker/index.php?func=detail&aid=4990&group_id=240&atid=975 – eddi

1

中的溶液用鹼R.本質想法是重複的值的每個組中df2等於行數的每個組中df1。這可以通過rep和參數length.out完成。它可以單獨爲每個組中by來完成,然後我就unlist爲載體,添加到df1

df1$values.y = unlist(by(df2, df2$group, 
        function(x) rep(x$values, length.out = length(df1$group[df1$group == x$group])))) 
+0

謝謝!我也在考慮重複,但我的解決方案並不像您的解決方案一樣。 – AnjaM

相關問題