簡體   English   中英

將帶有條件的自定義函數傳遞給 dplyr::mutate

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM