如何解决基于小标题之间的字符串的部分匹配来创建列
我有这些小标题:
library(tidyverse)
data <- tribble(
~code,~v1,~v2,~v3,'ENSG00000141510.14',10,20,30,'ENSG00000133703.10',15,90,50,'ENSG00000187848.11',18,17,16,55,47,22
)
code_info <- tribble(
~code,~name,'ENSG00000141510','p53','ENSG00000133703','KRAS','ENSG00000187848','P2XR2'
)
我想通过比较列data$name
和data$code
来创建新列code_info$code
。从这个意义上讲,code_info
标记有点儿充当data$code
中字符串的key:value对。
data
中的每一行的name
列将与name
中的code_info
列相等,其code_info$code
中的字符串是其中的一部分在data$code
中。
在此示例中,预期结果将是:
# A tibble: 4 x 5
code v1 v2 v3 name
<chr> <dbl> <dbl> <dbl> <chr>
1 ENSG00000141510.14 10 20 30 p53
2 ENSG00000133703.10 15 90 50 KRAS
3 ENSG00000187848.11 18 17 16 P2XR2
4 ENSG00000133703.10 55 47 22 KRAS
到目前为止,我一直通过在str_replace
中手动对一系列连续的mutate
进行硬编码来完成此操作,例如:
data %>%
mutate(
name = str_replace(code,"ENSG00000141510.14","p53"),name = str_replace(name,"ENSG00000133703.10","KRAS"),"ENSG00000187848.11","P2XR2")
)
# output:
# # A tibble: 4 x 5
# code v1 v2 v3 name
# <chr> <dbl> <dbl> <dbl> <chr>
# 1 ENSG00000141510.14 10 20 30 p53
# 2 ENSG00000133703.10 15 90 50 KRAS
# 3 ENSG00000187848.11 18 17 16 P2XR2
# 4 ENSG00000133703.10 55 47 22 KRAS
哪个可以做到,但显然不是很可扩展。是否有一种方法可以将信息合并到code_info
中,以便自动完成而无需对替换值进行硬编码?
解决方法
尝试使用left_join()
和separate()
进行这种选择,以便在数据集之间创建一个公共变量:
library(tidyverse)
#Data
data <- tribble(
~code,~v1,~v2,~v3,'ENSG00000141510.14',10,20,30,'ENSG00000133703.10',15,90,50,'ENSG00000187848.11',18,17,16,55,47,22
)
code_info <- tribble(
~code,~name,'ENSG00000141510','p53','ENSG00000133703','KRAS','ENSG00000187848','P2XR2'
)
#Code
data2 <- data %>% mutate(Dup=code) %>%
separate(Dup,c('V1','V2'),sep = '\\.') %>% select(-V2) %>%
left_join(code_info %>% rename(V1=code)) %>% select(-V1)
输出:
# A tibble: 4 x 5
code v1 v2 v3 name
<chr> <dbl> <dbl> <dbl> <chr>
1 ENSG00000141510.14 10 20 30 p53
2 ENSG00000133703.10 15 90 50 KRAS
3 ENSG00000187848.11 18 17 16 P2XR2
4 ENSG00000133703.10 55 47 22 KRAS
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。