打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

参考链接:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
R语言笔记丨数据的合并、拆分、整合
R语言学习系列之separate {tidyr}
关于R语言filter处理NA达不到理想效果最后选择%in%的记录--标题就是这么硬核--以后还是经常更新博客吧毕竟分享就是学到
数据挖掘 | TCGA中临床信息大整合
R语言 | 第六讲:R语言数据管理(二)
R语言基础知识
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服