Я пытаюсь классифицировать обервации с различными именами, группируя их по новым переменным - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в кодировании и пытаюсь использовать R, чтобы упростить управление мышами для исследовательской лаборатории, в которой я работаю.

Для использования mtcars в качестве примера.

Я хочу сгруппировать разные наблюдения в mtcars по новым переменным. Например, если я хотел сгруппировать автомобили по стране происхождения и производителя и году выпуска, стандартный размер шин.

Более конкретно, для моего примера, у меня есть группа мышей разных генотипов. Существуют разные схемы размножения для мышей, основанные на генотипе, генотипах c и других факторах, и я хочу сгруппировать их по этим различным факторам.

Проблема, которая у меня есть в настоящее время, заключается в том, что мыши, которые должны иметь одинаковые имена, иметь диапазон имен. Таким образом, мышь TSLP.KO, входит в варианты TSLP-KO, TSKP.KO.B6, TSLP; KO.B6 (N12F1) et c.

Давайте назовем это 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 с различными вариациями имен (существует конечное число вариаций), а также с предпочтительными псевдонимами и схемой разведения. групп и объединить это с моим большим фреймом данных, который содержит идентификаторы мыши, штаммы, возраст, пол, генотип и т. д. c.

Позволяет назвать это 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-"   ""                           

Результаты, которые я надеюсь for выглядит следующим образом:

 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. Я хочу добавить две новые переменные (Preferred name & Breeding Group) в DF1, сопоставив имена штаммов с одной из переменных "alternate_names" в DF2.

Я пробовал разные комбинации merge () и rbind.fill () с небольшим успехом.

Надеюсь, эти таблицы читабельны. Извини, я не лучше, подставляю их ... пока.

Заранее спасибо, если вы застряли со мной до конца этого вопроса. Я ценю любые советы.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Вы можете создать список замен и использовать функцию для выполнения нескольких замен, как указано здесь: Как исправить список неправильных орфографических зачислений сразу в R

Используя ваш пример, это будет go как то так:

## 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 голосов
/ 26 марта 2020

Возможно, вы могли бы попытаться использовать fuzzyjoin для слияния, поскольку имена довольно близки с разными знаками препинания в именах.

Проще сделать слияние со списком различных альтернативных имен в «длинной» форме. В этом примере я адаптировал ваши фреймы данных, использовал 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) 
...