【问题标题】:Create column based on partial match of strings between tibbles根据小标题之间字符串的部分匹配创建列
【发布时间】:2020-09-30 12:30:10
【问题描述】:

我有这些小玩意儿:

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 有点像 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

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

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 中,以便自动完成,而不需要对替换值进行硬编码?

【问题讨论】:

    标签: r tidyverse stringr dplyr tibble


    【解决方案1】:

    left_join()separate() 试试这个sloution,以便在数据集之间创建一个公共变量:

    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 
    

    【讨论】:

    • 太棒了,这很完美。我什至不知道你可以在对left_join 的调用中为另一个小标题添加一个管道,这真的很有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多