专栏首页育种数据分析之放飞自我R语言 | 根据数据框的顺序进行筛选

R语言 | 根据数据框的顺序进行筛选

目的

这里有两个数据框,两者有相同的列(ID),这里想把第一个数据框,按照第二个数据框的ID列进行提取,顺序和第二个数据框一致。

数据框1

> 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

数据框2

> 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记录位置,然后根据位置提取

> # 使用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)的父母本,肯定是错误的。

本文分享自微信公众号 - 育种数据分析之放飞自我(R-breeding),作者:邓飞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 全基因组选择介绍及实践-2:构建H矩阵

    H矩阵作为一步法的入门技术, 是需要掌握的, 本文以一篇文献为例, 介绍如何从头构建H矩阵. 文章包括H矩阵推导过程和代码实现.

    邓飞
  • R 语言中的汇总统计:如何批量计算不同因素不同水平的平均值

    有很多初学者遇到的问题,写出来,更好的自我总结,正所谓:“学然后知不足,教然后知困”。以输出(写博客)倒逼输入(学习),被动学习, kill time,是一个不...

    邓飞
  • 混合线性模型介绍--Wiki

    混合线性模型: 是即包括固定因子,又包括随机因子的模型。 混合线性模型被广泛应用于物理、生物和社会科学。尤其是一些重复测量的数据及面板数据。混合线性模型比较突出...

    邓飞
  • Yii2 学习笔记之数据库篇

    琯琯
  • myBatis实例

    用户1112962
  • 无限级子商户的查询优化方法

    A 有 2 个直接下级B、C,    B有2个直接下级D、E,    C有2个直接下级F、G

    宣言言言
  • 记一次mysql优化

    今天在技术经理的现场优化中,把一条需要40000ms的sql语句优化到9ms左右,将近提高4500多倍的速度

    botkenni
  • 深入理解 Laravel Eloquent(三)——模型间关系(关联)

    Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 “对象关系映射”(如果只把它当成 Database A...

    貟王軍
  • Yii2 开发小技巧

    琯琯
  • 「数据库」sql刷题(No.6)

    Hello 各位 ,我是公号「八点半技术站」的创作者 - Bruce.D (姓氏:豆)。

    八点半的Bruce、D

扫码关注云+社区

领取腾讯云代金券