【问题标题】:Replace Drugbank IDs with Drug name将 Drugbank ID 替换为药物名称
【发布时间】:2021-06-30 06:40:23
【问题描述】:

我有一个与来自 DrugBank 的药物相关的基因数据集。我希望简单地将所有药库 ID 转换为人类可读的药物名称。 如您所见,我的主要问题是某些基因与多种甚至数百种药物有关。多个药物 ID 在同一个逗号分隔的“列”中 R studio“匹配”或“合并功能”仅适用于每列中的第一个标识符,因此有效地删除了同一列“单元格”中的其余部分。我已经找到了在 Excel 上为我的最佳候选人手动执行此操作的方法,但对于我的 3000 个基因数据集来说这是不现实的。

理想情况下,我想做诸如“文本到列”之类的操作,但在行中,因此每一行都会保留其所有其他值,但只有单元格中的多个药库 ID 中的一个,然后就可以使用匹配功能替换它们。

drugbank 词汇表 (.csv) 如下所示:[DBvocabulary.csv]

DrugBank.ID Common.name

DB00001 来匹卢定

DB00002 西妥昔单抗

DB00003 Dornase alfa

DB00004 Denileukin diftitox

DB00005 依那西普

DB00006 比伐卢定

我的数据集 (.csv) 有 15 列,但重要的是:

[all_ph_active.csv]

Gene.Name DrugBank.ID

F8 DB09130

TCN2 DB00200

LDLR DB09270; DB11251; DB14003

ALB DB00070; DB00137; DB00159; DB00162; DB00214;

欢迎任何建议,提前谢谢!

【问题讨论】:

  • 你能用预期的输出更新吗
  • 请使用dput()包含您的数据的reproducible example
  • 请看下面 Joel 如何为Translationdf 提供数据,任何人都可以复制和使用这些数据。尝试以这种可重复的格式提供数据,以便更容易和更快地提供帮助。阅读how to give a reproducible example
  • 谢谢你,Ronak,是的,我看到并设法使用了它。下次会更好地格式化我的问题,谢谢

标签: r replace multiple-columns


【解决方案1】:

一种方法是将名称列连接到原始数据框。

我在下面提供了一个小例子

library(tidyverse)

Translation <- tribble(~"ID", ~"Name",
                 "I001", "name1",
                 "I002", "name2",
                 "I003", "name3",
                 "I004", "name4",)


df <- tribble(~"ID",
              "I001",
              "I001",
              "I004",
              "I004",
              "I002",
              "I002",
              "I001",
              "I002",
              "I003",
              "I003",
              "I004",
              "I002",
              "I001"
              )
                  
right_join(df, Translation, by=c("ID" ="ID"))
#> # A tibble: 13 x 2
#>    ID    Name 
#>    <chr> <chr>
#>  1 I001  name1
#>  2 I001  name1
#>  3 I004  name4
#>  4 I004  name4
#>  5 I002  name2
#>  6 I002  name2
#>  7 I001  name1
#>  8 I002  name2
#>  9 I003  name3
#> 10 I003  name3
#> 11 I004  name4
#> 12 I002  name2
#> 13 I001  name1

reprex package (v2.0.0) 于 2021 年 4 月 3 日创建

但是,此示例并未考虑提供的多个潜在名称。解决此问题的一种方法是为每种药物临时创建多个条目,如下例所示,然后以原始格式格式化名称。

我所做的一个假设是,药物每次都列在一个字符数组中,分号后跟一个空格作为分隔符。请纠正我,我会相应地更新代码:

library(tidyverse)

Translation <- tribble(~"ID", ~"Name",
                 "I001", "name1",
                 "I002", "name2",
                 "I003", "name3",
                 "I004", "name4",)


df <- tribble(~"ID",
              "I001",
              "I001",
              "I004; I002",
              "I004",
              "I002",
              "I002",
              "I001; I003",
              "I002",
              "I003",
              "I003",
              "I004",
              "I002; I001",
              "I001"
              )
                  
df_with_uniqueID <- df %>% 
  #Creates unique identifier for each row
  mutate(uniqueNum = 1: length(df$ID)) 

# Replace IDs in characters with array of IDs
df_with_uniqueID$ID <- strsplit(df_with_uniqueID$ID, split = "; ")

# Give each ID its own column
unnest(df_with_uniqueID, cols = c(ID)) %>% 
  #right_join the results
  right_join(Translation, by = c("ID" = "ID")) %>% 
  #reduce the additional columns
  nest(cols = c(ID, Name)) %>% 
  # Convert the array of names to a single string
  mutate(names = map(cols, function(x) paste(x$Name, collapse = "; "))) %>% 
  # Unnest our strings to a column
  unnest(names) %>% 
  # Remove the column we no longer need
  select(-cols)
#> # A tibble: 13 x 2
#>    uniqueNum names       
#>        <int> <chr>       
#>  1         1 name1       
#>  2         2 name1       
#>  3         3 name4; name2
#>  4         4 name4       
#>  5         5 name2       
#>  6         6 name2       
#>  7         7 name1; name3
#>  8         8 name2       
#>  9         9 name3       
#> 10        10 name3       
#> 11        11 name4       
#> 12        12 name2; name1
#> 13        13 name1

reprex package (v2.0.0) 于 2021-04-03 创建

【讨论】:

  • 感谢@Joel 花时间回答这个问题,这正是我所需要的以及一路上的提示。我只需要在 'strsplit' 之前使用 'DB %>% mutate_if(is.factor, as.character)' 将我的数据转换为字符
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 2014-02-07
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2021-01-21
  • 2019-07-18
  • 1970-01-01
相关资源
最近更新 更多