在单元格中分离数据并复制行数据

时间:2019-11-13 15:46:52

标签: r

我有一个单元格内的数据,用空格分隔。 例如,有一个城市名称的列,例如“ New York,NY”,然后是另一列,邮政编码为“ 12345 67891 23456”。 分隔此单行以使其变为三行的好方法是什么,每行都有“ New York,NY”,然后关联一个邮政编码?

2 个答案:

答案 0 :(得分:2)

尝试一下:

library(dplyr)
library(tidyr)
tibble(city = "New York, NY", zipcodes = "12345 67891 23456") %>%
  mutate(zipcodes = strsplit(zipcodes, "\\s+")) %>%
  unnest(zipcodes)
# # A tibble: 3 x 2
#   city         zipcodes
#   <chr>        <chr>   
# 1 New York, NY 12345   
# 2 New York, NY 67891   
# 3 New York, NY 23456   

基本R:

dat <- data.frame(city = "New York, NY", zipcodes = "12345 67891 23456", stringsAsFactors = FALSE)
zips <- strsplit(dat$zipcodes, "\\s+")
data.frame(city=rep(dat$city, each = lengths(zips)), zipcode = unlist(zips))
#           city zipcode
# 1 New York, NY   12345
# 2 New York, NY   67891
# 3 New York, NY   23456

此答案的一个前提是邮政编码由一个或多个空格(空格,制表符等)分隔。如果存在合法空间(在许多国家/地区是正确的),那么@ThomasIsCoding的方法可能是一个更好的起点,因为它尝试提取特定元素。如果邮政编码是字母数字并包含空格,则两者都将失败;例如,英国的邮政编码为BS2 0JA。在这种情况下,您将需要更多的逻辑来安全地提取它们。

答案 1 :(得分:1)

如果您使用的是base R,您是说这种输出吗?

s <- "New York, NY 12345 67891 23456"
data.frame(addr = paste0(gsub("(.*?\\s)\\d.*","\\1",s), unlist(regmatches(s,gregexpr("\\d+",s)))))

屈服

                addr
1 New York, NY 12345
2 New York, NY 67891
3 New York, NY 23456