【问题标题】:Using tidyr and regex to create two columns使用 tidyr 和 regex 创建两列
【发布时间】:2016-10-05 19:04:50
【问题描述】:

我想将包含代码和地名的一列数据分成两个单独的列。我尝试使用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

提前致谢!

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    我们可以使用正则表达式环视来指定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))
    

    【讨论】:

    • NJ 和 extract 我正在尝试类似的东西,但无法正确获取最后一行
    • @DavidArenburg 它错过的一件事是 NA。这里给出了""
    • 嗨@akrun,您对separate 的使用解决了我的最后一个数字和第一个字母被删除,并且地区出现在location_code 列中的问题。然而,它在 location_name 中的第一个空格被剪切之后引入了一个新问题,例如,这是结果 c("location", "town") 而不是 c("location 1", "town 3")。 extract 代码可以完美运行!
    • @kongbian 根据我帖子中的示例数据,我没有遇到这个问题
    猜你喜欢
    • 2015-07-22
    • 2021-08-30
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多