我正在尝试通过按新变量对观察结果进行分组来对具有各种名称的观察结果进行分类
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)
我是编码新手,一直在尝试使用 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)