首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据tibble之间字符串的部分匹配创建列

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

Stack Overflow用户
提问于 2020-09-30 20:30:11
回答 1查看 50关注 0票数 0

我有这些小毛病:

代码语言:javascript
复制
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。从这个意义上说,对于data$code中的字符串,code_info tibble类似于一个键:值对。

data中的每一行的name列将等于code_info中的name列,其code_info$code中的字符串是data$code中的字符串的一部分。

在此示例中,预期结果为:

代码语言:javascript
复制
 # 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来做到这一点,比如:

代码语言:javascript
复制
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中,以便自动完成这一操作,而无需对替换值进行硬编码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 20:42:31

left_join()separate()中尝试此方法,以便在数据集之间创建一个公共变量:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
# 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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64137612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档