楼主: 李会超
15924 16

[学习分享] R语言merge函数总结 [推广有奖]

  • 1关注
  • 31粉丝

已卖:1166份资源

教授

33%

还不是VIP/贵宾

-

威望
0
论坛币
121239 个
通用积分
62.0400
学术水平
140 点
热心指数
152 点
信用等级
84 点
经验
56173 点
帖子
1180
精华
1
在线时间
1120 小时
注册时间
2008-11-6
最后登录
2024-4-29

楼主
李会超 发表于 2014-10-6 10:27:27 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

写sql写习惯了,学R的时候也想用到类似sql里面的merge功能,看了r帮助文档后进行了一些总结
以r文档里面的例子来介绍,假如有这样两个数据框authors和books
authors <- data.frame(
    surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),
    nationality = c("US", "Australia", "US", "UK", "Australia"),
    deceased = c("yes", rep("no", 4)))
books <- data.frame(
    name = I(c("Tukey", "Venables", "Tierney",
             "Ripley", "Ripley", "McNeil", "R Core")),
    title = c("Exploratory Data Analysis",
              "Modern Applied Statistics ...",
              "LISP-STAT",
              "Spatial Statistics", "Stochastic Simulation",
              "Interactive Data Analysis",
              "An Introduction to R"),
    other.author = c(NA, "Ripley", NA, NA, NA, NA,
                     "Venables & Smith"))

如果要实现类似sql里面的inner join 功能,则用代码
m1 <- merge(authors, books, by.x = "surname", by.y = "name")
如果要实现left join功能则用代码
m1 <- merge(authors, books, by.x = "surname", by.y = "name",all.x=TRUE)
right join功能代码
m1 <- merge(authors, books, by.x = "surname", by.y = "name",all.y=TRUE)
all join功能代码
m1 <- merge(authors, books, by.x = "surname", by.y = "name",all=TRUE)

关于单变量匹配的总结就是这些,但对于多变量匹配呢,例如下面两个表,需要对k1,k2两个变量都相等的情况下匹配
x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5)
y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)

匹配代码如下merge(x, y, by = c("k1","k2"))  #inner join

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:merge函数 Merge R语言 Authors Author

已有 5 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
jiangbeilu + 5 + 3 + 1 精彩帖子
crystal8832 + 10 + 1 + 1 精彩帖子
LIXUANHANK + 1 + 1 + 1 精彩帖子
dxystata + 20 + 20 + 2 + 2 精彩帖子
李骥北 + 5 + 2 + 2 + 3 精彩帖子

总评分: 经验 + 20  论坛币 + 35  学术水平 + 11  热心指数 + 9  信用等级 + 5   查看全部评分

学无止境,坚持!

沙发
nieqiang110 学生认证  发表于 2014-10-6 12:08:06
haohaohaohaohaohaohao
已有 1 人评分经验 收起 理由
李会超 + 24 鼓励积极发帖讨论

总评分: 经验 + 24   查看全部评分

藤椅
李骥北 发表于 2014-10-6 14:20:26
请问一下I 函数到底啥意思,看了下帮助没怎么看明白。谢谢楼主啦。
已有 1 人评分经验 收起 理由
李会超 + 24 好的意见建议

总评分: 经验 + 24   查看全部评分

板凳
李会超 发表于 2014-10-6 15:07:52
李骥北 发表于 2014-10-6 14:20
请问一下I 函数到底啥意思,看了下帮助没怎么看明白。谢谢楼主啦。
I函数用于两个地方,一个是数据框建立时,可以保证字符型的向量不被转化为“因子”类型,另一个就是在公式建立的时候。在建立数据框之后,你可以对数据框用str函数看下加I的时候和不加I的时候,字符变量的区别,一个是字符型,一个是因子类型

报纸
李骥北 发表于 2014-10-6 15:37:05
李会超 发表于 2014-10-6 15:07
I函数用于两个地方,一个是数据框建立时,可以保证字符型的向量不被转化为“因子”类型,另一个就是在公式 ...
谢谢啦,一直对类型那些搞不明白。

地板
李会超 发表于 2014-10-6 15:53:07
李骥北 发表于 2014-10-6 15:37
谢谢啦,一直对类型那些搞不明白。
> aaa=factor(c('a','b','c'))
> c(aaa[1],aaa[3])
[1] 1 3
> class(c(aaa[1],aaa[3]))
[1] "integer"
这就是因子类型的讨厌之处,本来好好的字符变量被变成数字了

7
铁锷未残 学生认证  发表于 2014-11-13 00:01:42
谢谢分享

8
982288920@ 发表于 2014-12-8 11:20:08
楼主~~为啥我merge完,所有的数据都变成了NA啊?
  1. merge(made.date,s1,by.x = "DATE", by.y ="DATE" ,all.x=TRUE)
复制代码
  1. 1154  1983-02-27         星期日     NA  <NA>  <NA>      NA    NA    NA
  2. 1155  1983-02-28         星期一     NA  <NA>  <NA>      NA    NA    NA
  3. 1156  1983-03-01         星期二     NA  <NA>  <NA>      NA    NA    NA
  4. 1157  1983-03-02         星期三     NA  <NA>  <NA>      NA    NA    NA
  5. 1158  1983-03-03         星期四     NA  <NA>  <NA>      NA    NA    NA
  6. 1159  1983-03-04         星期五     NA  <NA>  <NA>      NA    NA    NA
  7. 1160  1983-03-05         星期六     NA  <NA>  <NA>      NA    NA    NA
  8. 1161  1983-03-06         星期日     NA  <NA>  <NA>      NA    NA    NA
  9. 1162  1983-03-07         星期一     NA  <NA>  <NA>      NA    NA    NA
  10. 1163  1983-03-08         星期二     NA  <NA>  <NA>      NA    NA    NA
  11. 1164  1983-03-09         星期三     NA  <NA>  <NA>      NA    NA    NA
  12. 1165  1983-03-10         星期四     NA  <NA>  <NA>      NA    NA    NA
  13. 1166  1983-03-11         星期五     NA  <NA>  <NA>      NA    NA    NA
  14. 1167  1983-03-12         星期六     NA  <NA>  <NA>      NA    NA    NA
复制代码

9
李会超 发表于 2014-12-8 17:59:25
无数据无法确定问题,但有一个问题,可以直接用by="DATE" 因为两个数据框有共同变量。

10
982288920@ 发表于 2014-12-8 20:05:09
982288920@ 发表于 2014-12-8 11:20
楼主~~为啥我merge完,所有的数据都变成了NA啊?
倒腾了一天终于知道原因了,因为一个DATE的class是Date,一个DATE的class是factor。。。所以不能merge,改了之后就可以了

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 01:34