我的数据框架中有一列包含特定基因位置。它要么只有一个位置(如果是SNP(,要么有一个位置范围(如果是删除、重复(。
我想将Gene_Locations列拆分为两列:Start_Position和Stop Position。如果它有一个范围,这很容易做到。但如果只有一个值,我希望它在Gene_Location列中,在Start_position和Stop_position列中都保留原始值。第二位并不容易做到,因为它不断出现NA或空白空白。如果能在这方面得到帮助,我将不胜感激。
这是我期望的专栏:
GeneLocation | Start_Position | Stop_Position |
---|---|---|
12346 | 23456 | 13456 |
123456-123457 | 123456 | 123457|
12345-122346 | 122345 | 122346 |
134567 | 134567 | |
12346 | 23456 | 13456 |
这是dplyr::coalesce
的一个很好的用例,它(类似于它命名的SQL函数(从一组向量中返回第一个非NA元素。
library(dplyr)
library(tidyr)
data %>%
separate(GeneLocation, c('Start_Position', 'Stop_Position')) %>%
mutate(Stop_Position = coalesce(Stop_Position, Start_Position))
coalesce
非常适合这个用例!这是一个带有ifelse
语句的解决方案。
library(dplyr)
library(tidyr)
df %>%
separate(GeneLocation, into = c("Start_Position", "Stop_Position"), sep = " - ", remove = FALSE) %>%
mutate(Stop_Position = ifelse(is.na(Stop_Position), Start_Position, Stop_Position))
GeneLocation Start_Position Stop_Position
1 123456 123456 123456
2 123456 - 123457 123456 123457
3 122345 - 122346 122345 122346
4 134567 134567 134567
5 123456 123456 123456