这里有两个数据框,两者有相同的列(ID),这里想把第一个数据框,按照第二个数据框的ID列进行提取,顺序和第二个数据框一致。
> tt = data.frame(id = 1:10,y = rnorm(10))
> tt
id y
1 1 0.7264999
2 2 -1.3817018
3 3 -0.8626703
4 4 2.0663756
5 5 0.1997253
6 6 0.5968497
7 7 -0.8836847
8 8 2.2224643
9 9 -1.5825250
10 10 -0.1530456
> id = data.frame(id = c(2,1,5,4,3))
> id
id
1 2
2 1
3 5
4 4
5 3
%in%
进行提取,会自动排序> # 使用 %in% 进行匹配时,会自动排序,不是id的顺序
> tt[tt$id %in% id$id,]
id y
1 1 0.7264999
2 2 -1.3817018
3 3 -0.8626703
4 4 2.0663756
5 5 0.1997253
> id
id
1 2
2 1
3 5
4 4
5 3
可以看到,匹配后的顺序为1,2,3,4,5
,而不是原来的2,1,5,4,3
> # 使用match可以达到目的
> loc = match(id$id,tt$id)
> loc
[1] 2 1 5 4 3
> tt[loc,]
id y
2 2 -1.3817018
1 1 0.7264999
5 5 0.1997253
4 4 2.0663756
3 3 -0.8626703
match
真香「完整代码:」
# 模拟两个数据框
tt = data.frame(id = 1:10,y = rnorm(10))
tt
id = data.frame(id = c(2,1,5,4,3))
id
# 使用 %in% 进行匹配时,会自动排序,不是id的顺序
tt[tt$id %in% id$id,]
id
# 使用match可以达到目的
loc = match(id$id,tt$id)
loc
tt[loc,]
本来我是有两个系谱文件,第一个系谱文件比较多,但是有错误。第二个系谱文件是第一个系谱文件的子集,它的系谱是正确的。我想将第一个系谱文件错误的系谱矫正一下。
「我的思路:」
1,用%in%
将第一个系谱的ID,根据第二个系谱的ID提取出来,然后用第二个系谱的Sire和Dam把第一个系谱相应的IID的Sire和Dam替换掉。如果第二个系谱本身是排序的,那么这样操作是没问题的。
「潜在的bug」
如果第二个系谱不是按顺序排的,那么上面的操作就会有错误。比如类似(2,1,4,3,5),在匹配后的顺序是(1,2,3,4,5),你用(1,2,3,4,5)的父母本,替换为(2,1,5,3,5)的父母本,肯定是错误的。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有