两个数据框类型的数据对象在进行整合的时候经常会用到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这两列的顺序。
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)
查看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参数只有一个值,如果有两个数值(即长度为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