我是编码新手,一直在尝试使用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()的不同组合,但收效甚微。
我希望这些表可读。对不起,我最好不要把它们陷进去...。
如果您坚持我直到问题结束,请先谢谢您。我感谢任何建议。
您可以构造一个替换列表并使用一个函数来执行多个替换,如此处发布的: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)
也许您可以尝试使用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)