Вы можете использовать пакет tidyverse
, который имеет функцию separate
.
Обратите внимание, что я скорее использую NA
вместо NULL
внутри мобильного вектора.Кроме того, я использую опцию stringsAsFactors = F
при создании кадра данных, чтобы избежать работы с факторами.
names <- c("Sia","Ryan","J","Ricky")
country <- c("London +1234567890","Paris", "Sydney +0123458796", "Delhi")
mobile <- c(NA, "+3579514862", NA, "+5554848123")
data <- data.frame(names,country,mobile, stringsAsFactors = F)
library(tidyverse)
data %>% as_tibble() %>%
separate(country, c("country", "number"), sep = " ", fill = "right") %>%
mutate(mobile = coalesce(mobile, number)) %>%
select(-number)
# A tibble: 4 x 3
names country mobile
<chr> <chr> <chr>
1 Sia London +1234567890
2 Ryan Paris +3579514862
3 J Sydney +0123458796
4 Ricky Delhi +5554848123
EDIT Если вы хотите сделать это без каналов (что я бы не сталрекомендуем, потому что код становится намного труднее читать) вы можете сделать это:
select(mutate(separate(as_tibble(data), country, c("country", "number"), sep = " ", fill = "right"), mobile = coalesce(mobile, number)), -number)