根据 tibbles 之间字符串的部分匹配创建列

Create column based on partial match of strings between tibbles

我有这些问题:

library(tidyverse)

data <- tribble(
                 ~code, ~v1, ~v2, ~v3,
  'ENSG00000141510.14',  10,  20,  30,
  'ENSG00000133703.10',  15,  90,  50,
  'ENSG00000187848.11',  18,  17,  16,
  'ENSG00000133703.10',  55,  47,  22
)

code_info <- tribble(
              ~code,   ~name,
  'ENSG00000141510',   'p53',
  'ENSG00000133703',  'KRAS',
  'ENSG00000187848', 'P2XR2'
)

我想通过比较列 data$codecode_info$code 创建一个新列 data$name。从这个意义上说,code_info tibble 有点像 key:value 对 data$code.

中的字符串

data 中的每一行的 name 列等于 code_info 中的 name 列,其字符串 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

到目前为止,我一直在通过在 mutate 中手动硬编码一堆顺序 str_replace 来做到这一点,例如:

data %>% 
  mutate(
    name = str_replace(code, "ENSG00000141510.14", "p53"), 
    name = str_replace(name, "ENSG00000133703.10", "KRAS"), 
    name = str_replace(name, "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,
  'ENSG00000133703.10',  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