只是你不熟悉Tidyverse罢了

文摘   2025-01-06 08:13   荷兰  

Tidyverse系列包语法流畅、拓展性极强,基本上能够解决日常的数据问题。

很多我们遇到的特殊情况,Hadley基本上都已经给了解决方案。只是,你可能不知道而已。

举个简单例子。

我有如下数据:

> head(data)
                SNP Chr      Pos      P.value       MAF  traits
X21960 S01_63999403   1 63999403 4.177131e-08 0.2190476 GLM.Oil
X23449 S01_66907486   1 66907486 6.079532e-13 0.4976191 GLM.Oil
X23456 S01_66907579   1 66907579 6.079532e-13 0.4976191 GLM.Oil
X31705 S01_78337592   1 78337592 2.187637e-08 0.4952381 GLM.Oil
X31706 S01_78337595   1 78337595 2.187637e-08 0.4952381 GLM.Oil
X31707 S01_78337633   1 78337633 6.079532e-13 0.4976191 GLM.Oil
> tail(data)
                    SNP Chr       Pos      P.value       MAF    traits
8124361    S16_65634495  16  65634495 2.224212e-10 0.4952381 SUPER.O.L
8429522   S16_137609049  16 137609049 4.876162e-24 0.4952381 SUPER.O.L
8991181    S17_79786214  17  79786214 6.258178e-09 0.4880952 SUPER.O.L
8992591    S17_79808088  17  79808088 1.569625e-08 0.4976191 SUPER.O.L
9631311    S18_67275513  18  67275513 3.575813e-10 0.5000000 SUPER.O.L
107743818 S19_154813332  19 154813332 9.315703e-52 0.1047619 SUPER.O.L

我想把data中的traits这一列按“.”进行分割为“模型”和“性状”两列,但是有些性状本身是带有“.”的。如果用separate函数的默认参数显然不行:

> tail(separate(data,"traits",c("Model","Trait"),sep = "\\."))
                    SNP Chr       Pos      P.value       MAF Model Trait
8124361    S16_65634495  16  65634495 2.224212e-10 0.4952381 SUPER     O
8429522   S16_137609049  16 137609049 4.876162e-24 0.4952381 SUPER     O
8991181    S17_79786214  17  79786214 6.258178e-09 0.4880952 SUPER     O
8992591    S17_79808088  17  79808088 1.569625e-08 0.4976191 SUPER     O
9631311    S18_67275513  18  67275513 3.575813e-10 0.5000000 SUPER     O
107743818 S19_154813332  19 154813332 9.315703e-52 0.1047619 SUPER     O
Warning message:
Expected 2 pieces. Additional pieces discarded in 82795 rows [193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, ...].

你也许想着用其他方式处理,但separate中其实有参数extra来处理此种情况。

extra参数搭配sep,如果 sep 是一个字符向量,则它控制当片段太多时会发生什么。共有三个有效选项:

  • "warn"(默认值):发出警告并删除额外的值。

  • "drop" :删除任何额外的值而不发出警告。

  • "merge" :最多仅分裂length(into)次

所以正常做法是:

> tail(separate(data,"traits",c("Model","Trait"),sep = "\\.",extra = "merge"))
                    SNP Chr       Pos      P.value       MAF Model Trait
8124361    S16_65634495  16  65634495 2.224212e-10 0.4952381 SUPER   O.L
8429522   S16_137609049  16 137609049 4.876162e-24 0.4952381 SUPER   O.L
8991181    S17_79786214  17  79786214 6.258178e-09 0.4880952 SUPER   O.L
8992591    S17_79808088  17  79808088 1.569625e-08 0.4976191 SUPER   O.L
9631311    S18_67275513  18  67275513 3.575813e-10 0.5000000 SUPER   O.L
107743818 S19_154813332  19 154813332 9.315703e-52 0.1047619 SUPER   O.L

再比如,当我们用separae或unite函数时,默认分割或合并后的原始列将不再存在,而有时我们需要将它保留下来。这时,可加上remove参数(默认TRUE,从输出数据帧中删除输入列),设置FASLE即可。

> tail(separate(data,"traits",c("Model","Trait"),sep = "\\.",extra = "merge",remove=F))
                    SNP Chr       Pos      P.value       MAF    traits Model Trait
8124361    S16_65634495  16  65634495 2.224212e-10 0.4952381 SUPER.O.L SUPER   O.L
8429522   S16_137609049  16 137609049 4.876162e-24 0.4952381 SUPER.O.L SUPER   O.L
8991181    S17_79786214  17  79786214 6.258178e-09 0.4880952 SUPER.O.L SUPER   O.L
8992591    S17_79808088  17  79808088 1.569625e-08 0.4976191 SUPER.O.L SUPER   O.L
9631311    S18_67275513  18  67275513 3.575813e-10 0.5000000 SUPER.O.L SUPER   O.L
107743818 S19_154813332  19 154813332 9.315703e-52 0.1047619 SUPER.O.L SUPER   O.L

以上只是举了一个小例子。

所以,你真正熟悉tidyverse的使用吗?



生物信息与育种
致力将生信、AI、大数据、云计算等技术应用于现代生物育种
 最新文章