我有一个如下所示的数据集:
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] 删除。
我来说两句