R语言中实现数据的匹配与合并

1、merge函数

dir()
test1 <- read.table("test1.txt", header = F)
test1
test2 <- read.table("test2.txt", header = F)
test2
result <- merge(test1, test2, by.x = "V1", by.y = "V1")
result
result2 <- merge(test1, test2, by.x = "V1", by.y = "V1", sort = F)
result2
> dir()     ## 列出当前工作路径下的文件
[1] "test1.txt" "test2.txt"
> test1 <- read.table("test1.txt", header = F)  ## 读取测试数据test1
> test1
   V1 V2
1 159  0
2 430  0
3 350  0
4 410  0
5 108  0
6 630  0
7 424  0
8 265  0
9 428  0
> test2 <- read.table("test2.txt", header = F)  ## 读取测试数据test2
> test2
   V1 V2
1 430 66
2 630 44
3 265 88
4 108 22
5 350 77
6 424 99
7 410 33
8 159 11
9 428 55
> result <- merge(test1, test2, by.x = "V1", by.y = "V1")  ## 利用merge进行合并,指定合并依据的列名,默认合并后并进行排序
> result
   V1 V2.x V2.y
1 108    0   22
2 159    0   11
3 265    0   88
4 350    0   77
5 410    0   33
6 424    0   99
7 428    0   55
8 430    0   66
9 630    0   44
> result2 <- merge(test1, test2, by.x = "V1", by.y = "V1", sort = F) ## 利用sort = F选项设定匹配合并后不排序
> result2
   V1 V2.x V2.y
1 159    0   11
2 430    0   66
3 350    0   77
4 410    0   33
5 108    0   22
6 630    0   44
7 424    0   99
8 265    0   88
9 428    0   55

2、match函数实现

dir()
test1 <- read.table("test1.txt", header = F)
test1
test2 <- read.table("test2.txt", header = F)
test2
result <- test2[match(test1$V1, test2$V1),]
result
> dir()
[1] "test1.txt" "test2.txt"
> test1 <- read.table("test1.txt", header = F)  ## 读取测试数据
> test1
   V1 V2
1 159  0
2 430  0
3 350  0
4 410  0
5 108  0
6 630  0
7 424  0
8 265  0
9 428  0
> test2 <- read.table("test2.txt", header = F)
> test2
   V1 V2
1 430 66
2 630 44
3 265 88
4 108 22
5 350 77
6 424 99
7 410 33
8 159 11
9 428 55
> result <- test2[match(test1$V1, test2$V1),]   ## 利用match函数匹配,返回索引,利用索引提取指定数据
> result
   V1 V2
8 159 11
1 430 66
5 350 77
7 410 33
4 108 22
2 630 44
6 424 99
3 265 88
9 428 55

3、shell实现

root@PC1:/home/test2# ls
test1.txt  test2.txt
root@PC1:/home/test2# cat test1.txt
159     0
430     0
350     0
410     0
108     0
630     0
424     0
265     0
428     0
root@PC1:/home/test2# cat test2.txt
430     66
630     44
265     88
108     22
350     77
424     99
410     33
159     11
428     55
root@PC1:/home/test2# cat test1.txt | while read {i,j}; do grep -w "$i" test2.txt >> result.txt; done  ## 利用while循环 + grep命令实现
root@PC1:/home/test2# ls
result.txt  test1.txt  test2.txt
root@PC1:/home/test2# cat result.txt
159     11
430     66
350     77
410     33
108     22
630     44
424     99
265     88
428     55
原文地址:https://www.cnblogs.com/liujiaxin2018/p/15734416.html