根据 vcf 文件中的交替列重新排序变体效果
Reorder variant effects according to alternate column in vcf file
我有一个 vcf 文件,其中包含一列以逗号分隔的变异等位基因 ("alt") 和另一列及其预测效果 ("info")。 (有关示例数据框,请参见下面的 dput()
结构。)但是,无论出于何种原因,变异效应预测软件以随机顺序输出效应,而不是 "alt" 列中列出的变异的相同顺序.
我只想从每个变体效果字段中提取某些信息(真实文件在该字段中有很多我不需要的信息)并将该信息连接成逗号分隔的字符串。但是,首先,变体效应必须根据它们在 "alt" 列中的顺序重新排序。
例如,下面数据框中的第 2 行当前如下所示:
alt info
T,G G|intron,T|splice_site
其中"G|intron"表示变体"G"的效果是"intron"。我希望最终输出具有预测效果,并重新排序以匹配 "alt" 列,如下所示:
alt info
T,G splice_site,intron
这样,第一个变异等位基因总是与第一个预测的效果相匹配,依此类推......顺序不能只是颠倒,因为在某些列中它们已经处于正确的顺序,或者可能有随机顺序的三个变体等...
我的想法是将 "G|intron" 变成 "key|value" 对,然后根据 "alt" 列对键重新排序,但我正在努力弄清楚该怎么做这个。 我正在使用管道以其他方式操作数据帧,因此该解决方案必须作为 dplyr 管道的一部分工作。
示例数据帧结构为:
var <- structure(list(chr = c("01", "01", "01", "01"), pos = c(10, 20,
30, 40), ref = c("T", "A", "G", "C"), alt = c("A", "T,G", "A,C,T",
"G"), info = c("A|missense|A2L", "G|intron,T|splice_site", "T|missense|V28R,A|missense|V28E,C|missense|V28L",
"G|intergenic")), row.names = c(NA, -4L), class = c("tbl_df",
"tbl", "data.frame"))
这可能不是最理想的(当然有一种方法可以分开而不是分裂氨基酸变体以保持变化类型,但我不知道),但它对你有用。
前几行代码将逗号分隔的字符串拆分为单独的项目。您可以使用 purrr::map(alt, ~ str_sort(.x))
或类似方法对它们进行单独排序,然后取消嵌套,而不是 left_join'ing,但是加入(使用散列)对于大数据来说会更快。由于我们已将 x tibble 设置为包含列 "alt" 的部分,因此连接的 tibble 将按该顺序排列。然后我使用 group_by 并总结根据坐标(和 ref 保持它)将它们带回一个字符串。
library(tidyverse)
var %>%
mutate_at(vars(alt, info), ~ stringr::str_split(., ",")) %>%
left_join(
x = {.} %>% select(-info) %>% unnest_legacy(),
y = {.} %>% select(-alt) %>% unnest_legacy() %>%
separate(info, into = c("alt","info","aa_change"), sep = "\|"),
by = c("chr","pos","ref","alt")
) %>%
mutate(info = ifelse(is.na(aa_change),info, sprintf("%s|%s",info, aa_change))) %>%
group_by(
chr, pos, ref
) %>%
summarise(
alt = paste(alt,collapse = ","),
info = paste(info, collapse = ",")
)
这会产生以下结果:
# A tibble: 4 x 5
# Groups: chr, pos [4]
chr pos ref alt info
<chr> <dbl> <chr> <chr> <chr>
1 01 10 T A missense|A2L
2 01 20 A T,G splice_site,intron
3 01 30 G A,C,T missense|V28E,missense|V28L,missense|V28R
4 01 40 C G intergenic
值得注意的是,在上面的代码中,我在连接中使用 {.}
来制作管道 tibble 的副本,因此我可以在连接之前修改它,这对于此操作至关重要。
我有一个 vcf 文件,其中包含一列以逗号分隔的变异等位基因 ("alt") 和另一列及其预测效果 ("info")。 (有关示例数据框,请参见下面的 dput()
结构。)但是,无论出于何种原因,变异效应预测软件以随机顺序输出效应,而不是 "alt" 列中列出的变异的相同顺序.
我只想从每个变体效果字段中提取某些信息(真实文件在该字段中有很多我不需要的信息)并将该信息连接成逗号分隔的字符串。但是,首先,变体效应必须根据它们在 "alt" 列中的顺序重新排序。
例如,下面数据框中的第 2 行当前如下所示:
alt info
T,G G|intron,T|splice_site
其中"G|intron"表示变体"G"的效果是"intron"。我希望最终输出具有预测效果,并重新排序以匹配 "alt" 列,如下所示:
alt info
T,G splice_site,intron
这样,第一个变异等位基因总是与第一个预测的效果相匹配,依此类推......顺序不能只是颠倒,因为在某些列中它们已经处于正确的顺序,或者可能有随机顺序的三个变体等...
我的想法是将 "G|intron" 变成 "key|value" 对,然后根据 "alt" 列对键重新排序,但我正在努力弄清楚该怎么做这个。 我正在使用管道以其他方式操作数据帧,因此该解决方案必须作为 dplyr 管道的一部分工作。
示例数据帧结构为:
var <- structure(list(chr = c("01", "01", "01", "01"), pos = c(10, 20,
30, 40), ref = c("T", "A", "G", "C"), alt = c("A", "T,G", "A,C,T",
"G"), info = c("A|missense|A2L", "G|intron,T|splice_site", "T|missense|V28R,A|missense|V28E,C|missense|V28L",
"G|intergenic")), row.names = c(NA, -4L), class = c("tbl_df",
"tbl", "data.frame"))
这可能不是最理想的(当然有一种方法可以分开而不是分裂氨基酸变体以保持变化类型,但我不知道),但它对你有用。
前几行代码将逗号分隔的字符串拆分为单独的项目。您可以使用 purrr::map(alt, ~ str_sort(.x))
或类似方法对它们进行单独排序,然后取消嵌套,而不是 left_join'ing,但是加入(使用散列)对于大数据来说会更快。由于我们已将 x tibble 设置为包含列 "alt" 的部分,因此连接的 tibble 将按该顺序排列。然后我使用 group_by 并总结根据坐标(和 ref 保持它)将它们带回一个字符串。
library(tidyverse)
var %>%
mutate_at(vars(alt, info), ~ stringr::str_split(., ",")) %>%
left_join(
x = {.} %>% select(-info) %>% unnest_legacy(),
y = {.} %>% select(-alt) %>% unnest_legacy() %>%
separate(info, into = c("alt","info","aa_change"), sep = "\|"),
by = c("chr","pos","ref","alt")
) %>%
mutate(info = ifelse(is.na(aa_change),info, sprintf("%s|%s",info, aa_change))) %>%
group_by(
chr, pos, ref
) %>%
summarise(
alt = paste(alt,collapse = ","),
info = paste(info, collapse = ",")
)
这会产生以下结果:
# A tibble: 4 x 5
# Groups: chr, pos [4]
chr pos ref alt info
<chr> <dbl> <chr> <chr> <chr>
1 01 10 T A missense|A2L
2 01 20 A T,G splice_site,intron
3 01 30 G A,C,T missense|V28E,missense|V28L,missense|V28R
4 01 40 C G intergenic
值得注意的是,在上面的代码中,我在连接中使用 {.}
来制作管道 tibble 的副本,因此我可以在连接之前修改它,这对于此操作至关重要。