2013-12-16 73 views
4

假設我有兩個dataframes:如何使用合併cbind 2個dataframes

df1 <- data.frame(matrix(rnorm(10*10),ncol=10)) 
df2 <- data.frame(matrix(rnorm(10*10),ncol=10)) 
colnames(df1) <- 1:10 
colnames(df2) <- 11:20 

如何使用mergecbind這些(我已經知道cbind但我感興趣的merge應用在這裏) 。

+4

這裏沒有什麼可以合併的。 –

回答

7

除了行名以外,沒有什麼東西要合併。

merge(df1, df2, by=0) 

請注意結果中行的順序!這些詞彙按行名排序。要獲得正確的順序,請使用order

x <- merge(df1, df2, by=0) 
x[order(as.numeric(x$Row.names)),] 
+0

不錯。爲什麼排序會搞砸?任何方式來保存行排序,就好像它是'cbind'? – user2763361

+0

我假設訂單是標記的詞彙順序。 1 <10 <2 <3 ...該命令可以通過在新的'名稱'列上排序來簡單地修復。我會將其添加到答案中。 –

+0

爲什麼我們不能合併rownames? – user2763361

4

我已經爲顯示目的製作了較小的矩陣。

> df1 <- data.frame(matrix(rnorm(15),ncol=3)) 
> df2 <- data.frame(matrix(rnorm(15),ncol=3)) 
> colnames(df1) <- paste0("A", 1:3) 
> colnames(df2) <- paste0("B", 4:6) 

我們有數據幀DF1和DF2,與列名A1,A2 & A3和B1,B3 &分別B2。因此,如你所知,cbind()只是將數據幀並排放在一起。

> cbind(df1, df2) 
     A1  A2  A3  B4  B5  B6 
1 2.055780 0.362796 1.25536 -1.748416 0.41855 -0.516635 
2 0.010779 0.086778 -0.68413 1.183762 -1.20362 0.041147 
3 -0.732393 0.235125 -0.89306 1.435362 -0.26066 -0.025933 
4 -2.493843 -2.654263 0.36107 0.083018 -0.82251 -0.991135 
5 0.935540 0.398196 -0.43043 0.470559 -0.54146 1.955555 

merge()查找公共列。在這種情況下沒有,所以它基本上產生了一個外層產品,其中每行df1與每行df2相匹配。

> merge(df1, df2) 
      A1  A2  A3  B4  B5  B6 
1 2.055780 0.362796 1.25536 -1.748416 0.41855 -0.516635 
2 0.010779 0.086778 -0.68413 -1.748416 0.41855 -0.516635 
3 -0.732393 0.235125 -0.89306 -1.748416 0.41855 -0.516635 
4 -2.493843 -2.654263 0.36107 -1.748416 0.41855 -0.516635 
5 0.935540 0.398196 -0.43043 -1.748416 0.41855 -0.516635 
6 2.055780 0.362796 1.25536 1.183762 -1.20362 0.041147 
7 0.010779 0.086778 -0.68413 1.183762 -1.20362 0.041147 
8 -0.732393 0.235125 -0.89306 1.183762 -1.20362 0.041147 
9 -2.493843 -2.654263 0.36107 1.183762 -1.20362 0.041147 
10 0.935540 0.398196 -0.43043 1.183762 -1.20362 0.041147 
11 2.055780 0.362796 1.25536 1.435362 -0.26066 -0.025933 
12 0.010779 0.086778 -0.68413 1.435362 -0.26066 -0.025933 
13 -0.732393 0.235125 -0.89306 1.435362 -0.26066 -0.025933 
14 -2.493843 -2.654263 0.36107 1.435362 -0.26066 -0.025933 
15 0.935540 0.398196 -0.43043 1.435362 -0.26066 -0.025933 
16 2.055780 0.362796 1.25536 0.083018 -0.82251 -0.991135 
17 0.010779 0.086778 -0.68413 0.083018 -0.82251 -0.991135 
18 -0.732393 0.235125 -0.89306 0.083018 -0.82251 -0.991135 
19 -2.493843 -2.654263 0.36107 0.083018 -0.82251 -0.991135 
20 0.935540 0.398196 -0.43043 0.083018 -0.82251 -0.991135 
21 2.055780 0.362796 1.25536 0.470559 -0.54146 1.955555 
22 0.010779 0.086778 -0.68413 0.470559 -0.54146 1.955555 
23 -0.732393 0.235125 -0.89306 0.470559 -0.54146 1.955555 
24 -2.493843 -2.654263 0.36107 0.470559 -0.54146 1.955555 
25 0.935540 0.398196 -0.43043 0.470559 -0.54146 1.955555 

如果我們重命名DF1的第一列,使其在DF2的第一列的名稱相匹配,然後合併()會在這兩列共同的價值觀。由於沒有共同的值,輸出是空的。

> colnames(df1)[1] = "B4" 
> merge(df1, df2) 
[1] B4 A2 A3 B5 B6 
<0 rows> (or 0-length row.names) 

但現在,如果我們複製(和反向,只是爲了讓事情變得有趣!)DF2的第一列到DF1的第一列...

> df1$B4 = rev(df2$B4) 
> df1 
     B4  A2  A3 
1 -0.50647 -0.48128 0.540799 
2 -0.70684 -0.35401 0.872514 
3 0.14341 1.12184 -0.079913 
4 -0.59989 0.81912 1.726494 
5 0.33864 0.85277 0.386702 
> df2 
     B4  B5  B6 
1 0.33864 1.83677 0.406717 
2 -0.59989 -0.43630 0.075029 
3 0.14341 1.01496 0.095534 
4 -0.70684 1.32414 -0.122613 
5 -0.50647 0.70709 -0.700225 

...並嘗試再合併......

> merge(df1, df2) 
     B4  A2  A3  B5  B6 
1 -0.70684 -0.35401 0.872514 1.32414 -0.122613 
2 -0.59989 0.81912 1.726494 -0.43630 0.075029 
3 -0.50647 -0.48128 0.540799 0.70709 -0.700225 
4 0.14341 1.12184 -0.079913 1.01496 0.095534 
5 0.33864 0.85277 0.386702 1.83677 0.406717 

...我們終於得到一些有意義的事:DF1和DF2的行根據DF2 $ B4在DF1 $ B4匹配值的值粘在一起。

我希望這有助於。