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