我正在尝试通过使用新变量对各个词进行分组,将其分类为各种名称

问题描述 投票:0回答:2

我是编码新手,一直在尝试使用R简化我从事的研究实验室的小鼠管理。

以mtcars为例。

我想通过新变量将mtcar中的不同观察结果分组。例如,如果我想按原产国和制造商以及制造年份(标准轮胎尺寸)对汽车进行分组。

更具体地说,对于我的示例,我有一堆不同基因型的小鼠。根据基因型构建,遗传背景和其他因素,有不同的小鼠育种方案,我想根据这些不同因素对它们进行分组。

我目前遇到的问题是,应该使用相同名称的鼠标具有一系列名称。因此,TSLP.KO鼠标来自TSLP-KO,TSKP.KO.B6,TSLP; KO.B6(N12F1)等各种变体。

让我们称之为DF1

   Mouse_ID Strain     Sex   Age_wk Genotype listgenobox DOB   Cage_ID Litter_ID Mice_Room_ID
   <fct>    <fct>      <fct>  <dbl> <fct>    <fct>       <fct> <fct>   <fct>     <fct>       
 1 ZDM862   TSLP.KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118599 B23235-2  SZ8         
 2 ZDM863   TSLP.KO.B6  M        6.7 ""       "_/_  _/_ ~ 12/1~ H118599 B23235-2  SZ8         
 3 ZDM864   TSLP;KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118600 B23235-2  SZ8         
 4 ZDM865   TSLP-KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118600 B23235-2  SZ8         
 5 ZDM866   TSLP:KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118600 B23235-2  SZ8         
 6 ZDM867   TSLPKO      F        6.7 ""       "_/_  _/_ ~ 12/1~ H118601 B23235-2  SZ8   

我的本能是制作一个具有不同命名变体(变体数量有限)以及首选昵称和育种方案组的excel文件,并将其与包含鼠标ID,株系,年龄,性别,基因型等。

让我们称之为DF2

Breeding_Group    Preferred Name   Alternate_Name Alternate_Name2 Alternate_Name3  
   <fct>          <fct>             <fct>          <fct>           <fct>           
 1 1a             TSLP Knockout    "TSLP.KO"      "TSLP.KO.B6"      ""             
 2 2a             C57BL~           "C57BL/6"      ""                ""                          
 3 1b             CCR2.~           "CCR2.CreERT2" "CCR2-CreERT2-"   ""                           

我希望获得的结果如下

 Mouse_ID Strain     Sex   Age_wk Genotype listgenobox DOB   Cage_ID Litter_ID Mice_Room_ID  Breeding_Group  Preferred Name
   <fct>    <fct>      <fct>  <dbl> <fct>    <fct>       <fct> <fct>   <fct>     <fct>         <fct>        <fct>    
 1 ZDM862   TSLP.KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118599 B23235-2  SZ8           1a        TSLP Knockout 
 2 ZDM863   TSLP.KO.B6  M        6.7 ""       "_/_  _/_ ~ 12/1~ H118599 B23235-2  SZ8           1a        TSLP Knockout 
 3 ZDM864   TSLP;KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118600 B23235-2  SZ8           1a        TSLP Knockout 
 4 ZDM865   TSLP-KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118600 B23235-2  SZ8           1a        TSLP Knockout 
 5 ZDM866   TSLP:KO     M        6.7 ""       "_/_  _/_ ~ 12/1~ H118600 B23235-2  SZ8           1a        TSLP Knockout 
 6 ZDM867   TSLPKO      F        6.7 ""       "_/_  _/_ ~ 12/1~ H118601 B23235-2  SZ8           1a        TSLP Knockout

TL / DR我想通过将应变名称与DF2中的“ alternate_names”变量之一匹配,来向DF1添加两个新变量(首选名称和育种组)。

我尝试过merge()和rbind.fill()的不同组合,但收效甚微。

我希望这些表可读。对不起,我最好不要把它们陷进去...。

如果您坚持我直到问题结束,请先谢谢您。我感谢任何建议。

r arrays associative-array
2个回答
0
投票

您可以构造一个替换列表并使用一个函数来执行多个替换,如此处发布的:How to correct list of mispellings at once in R

使用您的示例,它将像这样:

## names to replace
nn <- c("TSLP.KO","TSLP.KO.B6","TSLP;KO","TSLP-KO","TSLP:KO","TSLPKO")

## function that takes list with two elements and replaces first with second
multisub <- function(replacement.list, string, ...) {
    mygsub <- function(l, x) gsub(pattern = l[1], replacement = l[2], x, ...)
    Reduce(mygsub, replacement.list, init = string, right = TRUE)
}

## generate replacement list
mylist <- unlist(apply(cbind(nn, rep("TSLP Knockout", length(nn))), 1, list), recursive = FALSE)

## perform multiple replacement on `DF1$Strain`
DF1$`Preferred Name` <- multisub(mylist, DF1$Strain)

0
投票

也许您可以尝试使用fuzzyjoin进行合并,因为名称非常接近,名称中带有不同的标点符号。

与“ long”形式的不同替代名称列表合并比较容易。在此示例中,我调整了您的数据帧,使用pivot_longer放置长格式,然后执行fuzzyjoin

df2 %>%
  pivot_longer(cols = starts_with("Alternate"), names_to = "alt_num", names_pattern = "(\\d)$") %>%
  drop_na() %>%
  stringdist_inner_join(df1, by = c("value" = "Strain")) %>%
  group_by(Mouse_ID) %>%
  slice(1) %>%
  select(-c(alt_num, value, Strain))

输出

# A tibble: 10 x 5
# Groups:   Mouse_ID [10]
   Breeding_Group Preferred_Name Mouse_ID Sex   Age_wk
   <chr>          <chr>          <chr>    <chr>  <dbl>
 1 1a             TSLP_Knockout  ZDM862   M        6.7
 2 1a             TSLP_Knockout  ZDM863   M        6.7
 3 1a             TSLP_Knockout  ZDM864   M        6.7
 4 1a             TSLP_Knockout  ZDM865   M        6.7
 5 1a             TSLP_Knockout  ZDM866   M        6.7
 6 1a             TSLP_Knockout  ZDM867   F        6.7
 7 2a             C57BL~         ZDM868   F        6.7
 8 2a             C57BL~         ZDM869   M        6.7
 9 1b             CCR2.~         ZDM870   F        6.7
10 1b             CCR2.~         ZDM871   M        6.7

数据

其他示例数据组成。

df1 <- read.table(
  text =
  "Mouse_ID Strain     Sex   Age_wk 
  ZDM862   TSLP.KO     M        6.7         
  ZDM863   TSLP.KO.B6  M        6.7          
  ZDM864   TSLP;KO     M        6.7          
  ZDM865   TSLP-KO     M        6.7          
  ZDM866   TSLP:KO     M        6.7         
  ZDM867   TSLPKO      F        6.7
  ZDM868   C57BL       F        6.7
  ZDM869   C57BL6      M        6.7
  ZDM870   CCR2        F        6.7
  ZDM871   CCR2.CreERT M        6.7", header = T, stringsAsFactors = F)   

df2 <- read.table(
  text =
    "Breeding_Group    Preferred_Name AlternateName_1   AlternateName_2 AlternateName_3 
 1a             TSLP_Knockout  TSLP_Knockout  TSLP.KO      TSLP.KO.B6                   
 2a             C57BL~         C57BL~  C57BL/6      NA                                         
 1b             CCR2.~         CCR2.~  CCR2.CreERT2 CCR2-CreERT2- ", header = T, stringsAsFactors = F) 
© www.soinside.com 2019 - 2024. All rights reserved.