[英]Passing a custom function with conditionals to dplyr::mutate
我有一個如下所示的數據集:
seq <- tibble(REF = c("A","C","G","T","C","G"),
REF2 = c("A","G","G","A","C","G")) %>%
dplyr::mutate(UP = dplyr::lag(REF, n=1),
DOWN = dplyr::lead(REF, n=1))
# A tibble: 6 x 4
# REF REF2 UP DOWN
# <chr> <chr> <chr> <chr>
#1 A A NA C
#2 C G A G
#3 G G C T
#4 T A G C
#5 C C T G
#6 G G C NA
並且想在REF和REF2列的內容不同時更改上面的一些字母(在AT和GC之間)。 為此,我編寫了一個小函數,並使用dplyr::mutate
運行它,如下所示:
switch_strand <- function(base) {
if (base=="A") return ("T")
else if (base=="T") return ("A")
else if (base=="G") return ("C")
else if (base=="C") return ("G")
else if (is.na(base)) return (NA)
else stop("Error, base does not exist")
}
seq %>% dplyr::mutate(UP = ifelse(REF!=REF2,switch_strand(UP),UP),
DOWN = ifelse(REF!=REF2,switch_strand(DOWN),DOWN))
但是得到以下錯誤:
if (base == "A") return("T") else if (base == "T") return("A") else if (base == : 需要 TRUE/FALSE 的缺失值時出錯 另外:警告信息:在 if (base == "A") return("T") else if (base == "T") return("A") else if (base == :條件長度 > 1 且僅將使用第一個元素
我不明白,在dplyr::mutate
調用的值不是以行方式使用的嗎? 如果輸入單個字母,則上述函數按預期工作,但我不明白為什么在此處輸入完整列作為參數。 這怎么能修好?
預期的輸出是:
# A tibble: 6 x 4
# REF REF2 UP DOWN
# <chr> <chr> <chr> <chr>
#1 A A NA C
#2 C G T C
#3 G G C T
#4 T A C G
#5 C C T G
#6 G G C NA
編輯:我已經修復了switch_base
函數,所以如果 base 是 NA,它應該返回 NA,但在這種情況下似乎失敗了......它可能與此有關。
在變異之前傳遞附加函數“dplyr::rowwise()”:
seq %>% dplyr::rowwise() %>% dplyr::mutate(UP = ifelse(REF!=REF2,switch_strand(UP),UP),
DOWN = ifelse(REF!=REF2,switch_strand(DOWN),DOWN))
正如評論中已經提到的if
/ else
未矢量化,目前該函數僅適用於標量輸入而不適用於矢量。 由於您使用的是dplyr
,我們可以使用case_when
使其矢量化。
library(dplyr)
switch_strand <- function(base) {
case_when(base == "A" ~ "T",
base=="T" ~ "A",
base=="G" ~ "C",
base=="C" ~ "G")
}
然后嘗試的代碼可以正常工作
seq %>%
mutate(UP = ifelse(REF!=REF2,switch_strand(UP),UP),
DOWN = ifelse(REF!=REF2,switch_strand(DOWN),DOWN))
# REF REF2 UP DOWN
# <chr> <chr> <chr> <chr>
#1 A A NA C
#2 C G T C
#3 G G C T
#4 T A C G
#5 C C T G
#6 G G C NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.