利用R解决常见的数据匹配问题

数据匹配问题

有时我们需要将两个表之间根据某个字段的名称进行匹配,如果数据量达到万级单位,R提供了高效的解决方案,下面以成绩表作为示例

> ###数据匹配问题
> #创建成绩表
> name <- c("张三","李四","王五","小明","张华","李然","马涛","魏然")
> chinese <- c(88,55,56,89,58,65,75,56)
> english <- c(89,48,57,78,29,68,89,64)
> cj_data <- data.frame(name,chinese,english)
> name_data <- data.frame(name)
> cj_data1 <- cj_data[1:3,]
> cj_data2 <- cj_data[4:5,]
> cj_data3 <- cj_data[6:8,]
> name_data
  name
1 张三
2 李四
3 王五
4 小明
5 张华
6 李然
7 马涛
8 魏然
> cj_data1
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
> cj_data2
  name chinese english
4 小明      89      78
5 张华      58      29
> cj_data3
  name chinese english
6 李然      65      68
7 马涛      75      89
8 魏然      56      64

下面利用dplyr包中的left_join函数根据名称匹配,分以下两种情况

  1. 一对一匹配
> library(dplyr)
载入程辑包:‘dplyr’
> cj_one <- left_join(name_data,cj_data,by="name")
> cj_one
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
4 小明      89      78
5 张华      58      29
6 李然      65      68
7 马涛      75      89
8 魏然      56      64
  1. 一对多匹配(分以下两种情况)
 ###一对多的两种解决方案
> ##1.先合并后匹配
> cj_hb <- rbind(cj_data1,cj_data2,cj_data3)
> cj_hb
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
4 小明      89      78
5 张华      58      29
6 李然      65      68
7 马涛      75      89
8 魏然      56      64
> cj_sec <- left_join(name_data,cj_hb,by="name")
> cj_sec
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
4 小明      89      78
5 张华      58      29
6 李然      65      68
7 马涛      75      89
8 魏然      56      64
> ##2.先匹配后合并
> cj_th1 <- left_join(name_data,cj_data1,by="name")
> cj_th2 <- left_join(name_data,cj_data2,by="name")
> cj_th3 <- left_join(name_data,cj_data3,by="name")
> cj_th1
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
4 小明      NA      NA
5 张华      NA      NA
6 李然      NA      NA
7 马涛      NA      NA
8 魏然      NA      NA
> cj_th2
  name chinese english
1 张三      NA      NA
2 李四      NA      NA
3 王五      NA      NA
4 小明      89      78
5 张华      58      29
6 李然      NA      NA
7 马涛      NA      NA
8 魏然      NA      NA
> cj_th3
  name chinese english
1 张三      NA      NA
2 李四      NA      NA
3 王五      NA      NA
4 小明      NA      NA
5 张华      NA      NA
6 李然      65      68
7 马涛      75      89
8 魏然      56      64
> #需要将空值去掉进行合并
> cj_th1 <- na.omit(cj_th1)
> cj_th2 <- na.omit(cj_th2)
> cj_th3 <- na.omit(cj_th3)
> cj_th1
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
> cj_th2
  name chinese english
4 小明      89      78
5 张华      58      29
> cj_th3
  name chinese english
6 李然      65      68
7 马涛      75      89
8 魏然      56      64
> cj_th <- rbind(cj_th1,cj_th2,cj_th3)
> cj_th
  name chinese english
1 张三      88      89
2 李四      55      48
3 王五      56      57
4 小明      89      78
5 张华      58      29
6 李然      65      68
7 马涛      75      89
8 魏然      56      64

是不是很简单呢,如果你将处理很大的数据,可以尝试利用R来解决。

你可能感兴趣的:(R,笔记)