【发布时间】:2019-11-13 15:46:52
【问题描述】:
我有一个单元格内的数据,用空格分隔。 例如,有一列带有城市名称,例如“New York, NY”,而另一列带有邮政编码“12345 67891 23456”。 有什么好的方法可以将这一行分隔成三行,每行都有“纽约,纽约”,然后关联一个邮政编码?
【问题讨论】:
标签: r
我有一个单元格内的数据,用空格分隔。 例如,有一列带有城市名称,例如“New York, NY”,而另一列带有邮政编码“12345 67891 23456”。 有什么好的方法可以将这一行分隔成三行,每行都有“纽约,纽约”,然后关联一个邮政编码?
【问题讨论】:
标签: r
试试这个:
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。在这种情况下,您将需要更多的逻辑来安全地提取它们。
【讨论】:
如果你使用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
【讨论】: