2016-04-16 111 views
0

我必須從一個數據幀收集值並將其放置在另一個數據幀中。我試圖使用合併功能,但在第二個數據框中搞亂了順序。加入兩個數據幀

這就是我的數據外觀。

> df<-as.data.frame(cbind(letters[1:4],1:4)) 
> df 
    V1 V2 
1 a 1 
2 b 2 
3 c 3 
4 d 4 

> dflist <- data.frame("home"= sample(df[,1],15, replace = TRUE)) 
> 
> dflist$away <-sample(df[,1],15, replace = TRUE) 
> dflist 
    home away 
1  a b 
2  a a 
3  d c 
4  d a 
5  c c 
6  a c 
7  b d 
8  b b 
9  a b 
10 b d 
11 b a 
12 a a 
13 a c 
14 c b 
15 d a 

預期結果應該是這樣的。

home away value1 value2 
1  a b 1 2 
2  a a 1 1 
3  d c 4 3 
4  d a 4 1 
5  c c 3 3 
. 

如果我在這裏使用合併,結果表將失去它的順序。

+0

假設你想保持秩序'dflist',您可以創建一個索引列(如:'dflist $ IDX < - 1:nrow(dflist)',沒錯,有很多方法可以做到這一點,但這只是一個例子)。然後通過'idx'列對最終結果進行排序。 – steveb

+1

請使用'set.seed'作爲樣本的重現性。 – DatamineR

回答

0

你可以試試這個:

dflist[c("value1", "value2")] <- t(apply(dflist, 1, function(x) 
    c(df[match(x[1], df$V1),2], df[match(x[2], df$V1),2]))) 
dflist 
    home away value1 value2 
1  a b  1  2 
2  a a  1  1 
3  d c  4  3 
4  d a  4  1 
5  c c  3  3 
6  a c  1  3 
7  b d  2  4 
8  b b  2  2 
9  a b  1  2 
10 b d  2  4 
11 b a  2  1 
12 a a  1  1 
13 a c  1  3 
14 c b  3  2 
15 d a  4  1 
+0

這正是我想要的。但是當我複製您的文本時,我收到錯誤消息。 (函數(x) + c(df [match(x [1],df $ V1),2](dflist [c(「value1」,「value2」)] ,if(inherits(X [[j]],「data.frame」)&& ncol(xj)> 1L)X [x [2],df $ V1),2]))) [j]] < - as.matrix(X [[j]]): 缺少值,其中TRUE/FALSE需要 – samot79

+0

我的歉意。工程就像一個魅力:) – samot79

+0

很高興聽到:-) – DatamineR