考虑以下两个字符串的可变长度的两列数据帧:
library("tidyverse")
df <- tibble(REF = c("TTG", "CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT", "T", "TTGTGTGTGTGTGTGTGTGTGT"),
ALT = c("T", "CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT,CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT", "TTG", "TTGTGTGTGTGTGTGTGTGTGTGT"))
# # A tibble: 4 × 2
# REF ALT
# <chr> <chr>
# 1 TTG T
# 2 CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT,CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT
# 3 T TTG
# 4 TTGTGTGTGTGTGTGTGTGTGT TTGTGTGTGTGTGTGTGTGTGTGT
与第REF
列不同,第ALT
列有时包含几个由逗号连接的字符串(例如第2行).
我想比较REF
(REF_LEN
)和ALT
(ALT_LEN
)中字符串的长度,并生成一个包含以下值的TYPE
列:
-
REF_LEN
ALT_LEN
时的"SNM" -
REF_LEN
时为"INS"<;ALT_LEN
- 当
REF_LEN
>;ALT_LEN
但我想这样做,当ALT
中有几个字符串时,这个新TYPE
列的输出也包含这些类型,并用逗号分隔.i、 例如,此处的预期输出为:
"DEL" "INS,DEL" "INS" "INS"
到目前为止,我知道如何在ALT
中获得值的长度,但我无法折叠这些值,因为输出将包含表中所有ALT
的长度,而不仅仅是成对的(即1,35,31,3,24
):
df %>%
dplyr::mutate(REF_LEN = str_length(REF),
ALT_LEN = str_split(ALT, ","),
ALT_LEN = purrr::map(ALT_LEN, str_length) %>% unlist() %>% paste(collapse = ","))
正如您所看到的,上面的代码不完整,但我也无法使用帮助函数在不同的方向上完成上面的TYPE
列.这将返回许多错误,但不确定原因,因为它似乎可以很好地处理ALT_LEN
中的值:
name <- function(alt_lens, ref_len) {
alt_lens <- unlist(alt_lens)
ifelse(alt_lens < ref_len, "DEL", ifelse(alt_lens > ref_len, "INS", "SNM"))
}
df %>%
dplyr::mutate(REF_LEN = str_length(REF),
ALT_LEN = str_split(ALT, ","),
TYPE = purrr::map(ALT_LEN, str_length) %>% name(REF_LEN))
有什么 idea 吗?谢谢