首页 > 解决方案 > 如何从列中提取部分数据并使用 R 将其粘贴到另一列中?

问题描述

我想从一列中提取部分数据并使用 R 将其粘贴到另一列中:

我的数据如下所示:

names <- c("Sia","Ryan","J","Ricky")
country <- c("London +1234567890","Paris", "Sydney +0123458796", "Delhi")
mobile <- c(NULL,+3579514862,NULL,+5554848123)
data <- data.frame(names,country,mobile)
data
> data
  names            country     mobile
1   Sia London +1234567890 NULL
2  Ryan              Paris +3579514862
3     J Sydney +0123458796 NULL
4 Ricky              Delhi +5554848123

我想在适用的情况下将电话号码与国家列分开并将其放入手机中。

输出应该是,

> data
  names            country     mobile
1   Sia             London +1234567890    
2  Ryan              Paris +3579514862
3     J             Sydney +0123458796
4 Ricky              Delhi +5554848123

标签: rdataframedplyr

解决方案


您可以使用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

编辑 如果您想在没有管道的情况下执行此操作(我不建议这样做,因为代码变得更加难以阅读),您可以这样做:

select(mutate(separate(as_tibble(data), country, c("country", "number"), sep = " ", fill = "right"), mobile = coalesce(mobile, number)), -number)

推荐阅读