R語言的merge函數可以實現類似SQL的有點類似 left join right join 或者類似union的效果。
> 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
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這兩列的順序。
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形式輸出。