考慮以下具有兩列可變長度字串的資料框:
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
與 column 不同REF,columnALT有時包含幾個用逗號連接的字串(例如第 2 行)。
我想比較REF( REF_LEN) 和ALT( ALT_LEN) 中字串的長度,并生成一個TYPE包含值的列:
- “SNM”當
REF_LEN=ALT_LEN - “INS”當
REF_LEN<ALT_LEN - “DEL”當
REF_LEN>ALT_LEN
但是我想這樣做,當 中存在多個字串時ALT,這個新TYPE列的輸出包含這些型別并用逗號分隔。即,這里的預期輸出將是:
"DEL" "INS,DEL" "INS" "INS"
到目前為止,我知道如何獲取 中的值的長度ALT,但是我無法折疊這些值,因為輸出將包含ALT表中所有 s 的長度,而不僅僅是成對的(即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))
有任何想法嗎?謝謝!
uj5u.com熱心網友回復:
這是一個codegolf-ish基礎R解決方案:
df <- data.frame(REF = c("TTG", "CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT", "T", "TTGTGTGTGTGTGTGTGTGTGT"),
ALT = c("T", "CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT,CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT", "TTG", "TTGTGTGTGTGTGTGTGTGTGTGT"))
df$TYPE <- mapply(
function(x, y) paste(c("INS", "SNM", "DEL")[2 sign(nchar(x)- nchar(y))], collapse = ","),
df$REF, strsplit(df$ALT, ","), USE.NAMES = FALSE)
df$TYPE
#> [1] "DEL" "INS,DEL" "INS" "INS"
由reprex 包于 2022-04-20 創建(v2.0.1)
uj5u.com熱心網友回復:
更新:洗掉了第一個答案。感謝 akrun 指點我那里!概念是一樣的:使用ncharwith case_when,不同的是使用separate_rowsfromtidyr包:
library(dplyr)
library(tidyr)
df %>%
mutate(id = row_number()) %>%
separate_rows(ALT, sep = ",") %>%
mutate(TYPE = case_when(nchar(REF)==nchar(ALT) ~ "SNM",
nchar(REF)< nchar(ALT) ~ "INS",
nchar(REF)> nchar(ALT) ~ "DEL",
TRUE ~ NA_character_)) %>%
group_by(id) %>%
mutate(TYPE = toString(TYPE)) %>%
slice(1)
REF ALT id TYPE
<chr> <chr> <int> <chr>
1 TTG T 1 DEL
2 CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT 2 INS, DEL
3 T TTG 3 INS
4 TTGTGTGTGTGTGTGTGTGTGT TTGTGTGTGTGTGTGTGTGTGTGT 4 INS
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460020.html
標籤:r
