将一列拆分为两列,如果没有两个值,则保留原始值

Split one column into two, retain original value if there aren't two values

我的数据框中有一列包含特定基因位置。它要么具有单个位置(在 SNP 的情况下),要么具有位置范围(在删除、复制的情况下)。

我想将 Gene_Locations 列拆分为两列:Start_Position,停止位置。如果它有一个范围,这很容易做到。但是在只有一个值的情况下,我希望它在 Gene_Location 列、Start_position 和 Stop_position 列中保留原始值。第二位并不容易,因为它不断出现 NA,即空白。我将不胜感激。

这是我预期的专栏:

GeneLocation Start_Position Stop_Position
123456 123456 123456
123456 - 123457 123456 123457
122345 - 122346 122345 122346
134567 134567 134567
123456 123456 123456

这是我的实际专栏:

GeneLocation Start_Position Stop_Position
123456 123456 NA
123456 - 123457 123456 123457
122345 - 122346 122345 122346
134567 134567 NA
123456 123456 NA
dat2 <- data %>% separate(GeneLocation, c('Start_Position', 'Stop_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

这是 dplyr::coalesce 的一个很好的用例,它(类似于它命名的 SQL 函数)returns 一组中的第一个 non-NA 元素向量。

library(dplyr)
library(tidyr)
data %>% 
  separate(GeneLocation, c('Start_Position', 'Stop_Position')) %>%
  mutate(Stop_Position = coalesce(Stop_Position, Start_Position))