将带有条件的自定义函数传递给 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 == : missing value where TRUE/FALSE need) 中的错误另外:警告信息:在 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))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章