将一列拆分为两列,如果没有两个值,则保留原始值
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))
我的数据框中有一列包含特定基因位置。它要么具有单个位置(在 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))