使用tidyr和regex创建两列

时间:2016-10-05 19:04:51

标签: r tidyr

我想将包含代码和地名的一列数据分成两个单独的列。我尝试使用tidyr的单独命令,但在使用正则表达式时遇到了一些困难(我之前没有使用它们,也无法弄清楚我做错了什么/正则表达式是如何工作的)。

数据在格式方面非常一致。大多数观察以代码开始,后跟一个位置。偶尔会有一个观察点只是一个位置(没有代码)。以下是数据样本:

df <- read.table(text = c("
obs  name
1    01-220 location 1
2    05-23 town 3
3    District 2"), header = T)

我使用以下代码:

df <- df %>% separate(name, into = c("location_code", "location_name"), sep = "([0-9] [A-z])")    

导致(注意到location_code的最后一个数字和location_name的第一个字母缺失):

obs   location_code    location_name
1     01-22           ocation 1
2     05-2            own 3
3     District 2       NA

我想要的输出是:

# obs   location_code    location_name
# 1     01-220           location 1
# 2     05-23            town 3
# 3     NA               District 2

提前致谢!

1 个答案:

答案 0 :(得分:4)

我们可以使用正则表达式外观指定sep

separate(df, name, into = c("location_code", "location_time"),
                                  "(?<=([0-9] )|\\b)(?=[A-Za-z])")
#   obs location_code location_time
#1   1       01-220     location 1
#2   2        05-23         town 3
#3   3                  District 2

extract

extract(df, name, into = c("location_code", "location_time"), "([0-9-]*)\\s*(.*)")
#  obs location_code location_time
#1   1        01-220    location 1
#2   2         05-23        town 3
#3   3                  District 2

数据

df <- structure(list(obs = 1:3, name = c("01-220 location 1", "05-23 town 3", 
 "District 2")), .Names = c("obs", "name"), class = "data.frame", row.names = c(NA, 
 -3L))