R数据分析之merge函数

两个数据框类型的数据对象在进行整合的时候经常会用到merge函数,但是老是忘记all= TRUE, all= FALSE, all.x= TRUE, all.y= TRUE的区别,下面抄个简单的例子来加深下印象。

创建示例数据集

id1 <- c(2, 3, 4, 5, 7)
heights <- c(62, 65, 71, 71, 67)
df1 <- data.frame(id = id1, heights)

id2 <- c(1, 2, 6:10)
weights <- c(147, 113, 168, 135, 142, 159, 160)
df2 <- data.frame(id = id2, weights)

使用默认参数进行整合

df1
##   id heights
## 1  2      62
## 2  3      65
## 3  4      71
## 4  5      71
## 5  7      67
df2
##   id weights
## 1  1     147
## 2  2     113
## 3  6     168
## 4  7     135
## 5  8     142
## 6  9     159
## 7 10     160

merge(df1, df2, all = FALSE)
##   id heights weights
## 1  2      62     113
## 2  7      67     135

merge(df2, df1, all = FALSE)
##   id weights heights
## 1  2     113      62
## 2  7     135      67

intersect(df1$id, df2$id)
## [1] 2 7

执行merge函数时,函数自动会找到两个数据框df1和df2共有的列,即id那一列(即相当于by= "id"),当参数all= FALSE时,会将两个数据框中该列数值相等的那些行输出来,类似于对这两个数据框的id这一列求交集(intersection)。此例中是id为2或7这两行。此外,还可以发现df1和df2的输入顺序不会影响最终结果,仅仅会影响输出结果中heights和weights这两列的顺序。

调整all参数

merge(df1, df2, by = "id", all = TRUE)
##    id heights weights
## 1   1      NA     147
## 2   2      62     113
## 3   3      65      NA
## 4   4      71      NA
## 5   5      71      NA
## 6   6      NA     168
## 7   7      67     135
## 8   8      NA     142
## 9   9      NA     159
## 10 10      NA     160

sort(union(df1$id, df2$id))
##  [1]  1  2  3  4  5  6  7  8  9 10

当参数all= TRUE时, 会将id这一列的所有数值都列出来,但要去除重复的数值(即id为1和2的那两行),这类似于对两个数据框的这一列求补集(union)

调整all.x和all.y参数

查看merge函数的帮助文档,会发现还有all.x, all.y这两个参数,默认情况下,all.x= all, all.y= all,因此根据自己的情况还可以单独来调整这两参数的值。

merge(df1, df2, by = "id", all.x = TRUE)
##   id heights weights
## 1  2      62     113
## 2  3      65      NA
## 3  4      71      NA
## 4  5      71      NA
## 5  7      67     135

上面的命令中设置了all.x= TRUE,此外还有默认的all.y=all=FALSE,输出结果中id那一列就是df1中的id那一列,并且多了weights列,并且如果df2中id列中没有与df1中的id列中相等的数值,则输出结果中与之相对应的weights列的数值为NA。

同样设置了all.y= TRUE的话,会看到输出结果中对应的heights列中的数值为NA。

merge(df1, df2, by = "id", all.y = TRUE)
##   id heights weights
## 1  1      NA     147
## 2  2      62     113
## 3  6      NA     168
## 4  7      67     135
## 5  8      NA     142
## 6  9      NA     159
## 7 10      NA     160

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形式输出。

参考链接:
1. R function of the day
2. Dummies site