我正在尝试通过按新变量对观察结果进行分组来对具有各种名称的观察结果进行分类

I am trying to categorize obervations with a variety of names by grouping them by new variables

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

以mtcars为例。

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

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

我目前遇到的问题是,本应具有相同名称的鼠标具有一系列名称。所以 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() 的不同组合,但收效甚微。

我希望这些表格是可读的。对不起,我还没有更好地陷害他们……但是。

如果你一直坚持到这个问题的结尾,提前谢谢你。我感谢任何建议。

也许你可以尝试使用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) 

您可以构造一个替换列表并使用一个函数执行多个替换,如下所示:

使用你的例子,它会是这样的:

## 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)