R語言之merge函數案例


R語言的merge函數可以實現類似SQL的有點類似 left join right join 或者類似union的效果。

df1 = data.frame(CustomerId=c(1:6),Product=c(rep("Toaster",3),rep("Radio",3)))
> df2 = data.frame(CustomerId=c(2,4,6,7),State=c(rep("Alabama",3),rep("Ohio",1)))

> df1
CustomerId Product
1 1 Toaster
2 2 Toaster
3 3 Toaster
4 4 Radio
5 5 Radio
6 6 Radio

> df2
CustomerId State
1 2 Alabama
2 4 Alabama
3 6 Alabama
4 7 Ohio

> merge(df1, df2, all=TRUE)
CustomerId Product State
1 1 Toaster <NA>
2 2 Toaster Alabama
3 3 Toaster <NA>
4 4 Radio Alabama
5 5 Radio <NA>
6 6 Radio Alabama
7 7 <NA> Ohio

#full join的效果
> merge(df1, df2, all.x=TRUE)

CustomerId Product State
1 1 Toaster <NA>
2 2 Toaster Alabama
3 3 Toaster <NA>
4 4 Radio Alabama
5 5 Radio <NA>
6 6 Radio Alabama

#left join的效果

> merge(df1, df2, all.y=TRUE)
CustomerId Product State
1 2 Toaster Alabama
2 4 Radio Alabama
3 6 Radio Alabama
4 7 <NA> Ohio

#right join的效果。。

在df1 和df2 有相同的列名稱下

> df1<-data.frame(col1=c(1,2),col2=c(2,3))
> df2<-data.frame(col1=c(1,4),col2=c(2,100))
> merge(df1, df2, all=TRUE)
col1 col2
1 1 2
2 2 3
3 4 100

#這個達到的是union的效果

執行 merge函數時,函數自動會找到兩個數據框df1和df2共有的列,即id那一列(即相當於 by= "id"),當參數 all= FALSE時,會將兩個數據框中該列數值相等的那些行輸出來,類似於對這兩個數據框的id這一列求交集(intersection)。此例中是id為2或7這兩行。此外,還可以發現df1和df2的輸入順序不會影響最終結果,僅僅會影響輸出結果中heights和weights這兩列的順序。
 
更詳細可以參考 http://rstudio-pubs-static.s3.amazonaws.com/13602_96265a9b3bac4cb1b214340770aa18a1.html
 
------------

by參數的使用

上面的示例中by參數只有一個值,如果有兩個數值(即長度為2的向量),也就是兩個數據框中有共同的兩列。

df1$sex <- c("f", "m", "f", "f", "m") df2$sex <- c("f", "f", "m", "m", "f", "f", "f") merge(df1, df2) 
##   id sex heights weights
## 1  2   f      62     113
## 2  7   m      67     135
merge(df1, df2, by = c("id", "sex")) 
##   id sex heights weights
## 1  2   f      62     113
## 2  7   m      67     135
merge(df1, df2, by = "id") 
##   id heights sex.x weights sex.y
## 1  2      62     f     113     f
## 2  7      67     m     135     m

為兩個數據框分別添加一列后,這樣它們就有了共同的兩列。當運行merge函數后發現,函數會自動找到共同的列,然后找到id和sex這兩列中共有的數值。此外,如果只設定by= "id"的話,則兩數據框中共有的sex那一列則會以sex.x和sex.y形式輸出。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM