基于小标题之间的字符串的部分匹配来创建列

问题描述

我有这些小标题

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$namedata$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