【问题标题】:How to Split Columns in R based on First Space如何根据第一个空格拆分 R 中的列
【发布时间】:2022-01-22 12:47:28
【问题描述】:

我有这段代码在第二个空格上拆分列,但我不知道如何修改它以仅在第一个空格上拆分。我对正则表达式不太熟悉。

library(tidyr)

df <- data.frame(Location = c("San Jose CA", "Fremont CA", "Santa Clara CA"))
separate(df, Location, into = c("city", "state"), sep = " (?=[^ ]+$)")

#          city state
# 1    San Jose    CA
# 2     Fremont    CA
# 3 Santa Clara    CA

【问题讨论】:

  • 如果您确实需要在 first 空间上拆分,那么我建议您编辑您的问题以反映这一点。您当前的问题旨在将城市与州分开,这需要在 last 空间上进行拆分。

标签: r regex string regex-lookarounds


【解决方案1】:

你可以使用

library(tidyr)
df <- data.frame(Location = c("San Jose CA", "Fremont CA", "Santa Clara CA"))
df_new <- separate(df, Location, into = c("city", "state"), sep = "^\\S*\\K\\s+")

输出:

> df_new
     city      state
1     San    Jose CA
2 Fremont         CA
3   Santa   Clara CA

^\S*\K\s+ 正则表达式匹配

  • ^ - 字符串开头
  • \S* - 零个或多个非空白字符
  • \K - 匹配重置运算符,将匹配的文本从整体匹配内存缓冲区中丢弃
  • \s+ - 一个或多个空格字符。

注意:如果你的字符串可以有前导空格,并且你想忽略这个前导空格,你可以在^ 之后添加\\s* 并使用

sep = "^\\s*\\S+\\K\\s+"

这里,\S+ 将要求在拆分字符串的空格之前至少存在一个(或多个)非空格字符。

【讨论】:

  • 完美,谢谢!感谢您解释我正在尝试学习的正则表达式。
【解决方案2】:

如果你想坚持separate,那就试试吧:

separate(df, Location, into=c("city", "state"), sep=" (?=[A-Z]{2}$)")

我们也可以在此处尝试使用sub 作为基本 R 选项:

df$city <- sub("\\s+[A-Z]{2}$", "", df$Location)
df$state <- sub("^.*\\s+", "", df$Location)

【讨论】:

  • 谢谢,但结果相同。它在第二个空间分开。我想在第一个空格上分开。
  • @CrashBandicoot Check this demo 看到我在separate 调用中使用的sep 是针对正确的第二个空格。您确定要在 first 空间上拆分吗?
  • 是的,这是我需要定位的第一个空间。我知道在这个例子的上下文中它没有多大意义
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2021-09-11
  • 2020-11-02
相关资源
最近更新 更多