如何根据第一个空格拆分 R 中的列

Posted

技术标签:

【中文标题】如何根据第一个空格拆分 R 中的列【英文标题】:How to Split Columns in R based on First Space 【发布时间】: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 空间上进行拆分。 【参考方案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 空间上拆分吗? 是的,这是我需要定位的第一个空间。我知道在这个例子的上下文中它没有多大意义

以上是关于如何根据第一个空格拆分 R 中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何将一张表复制到另一张表

拆分数据框的列并将它们重新组合为一列而不显示空格

R拆分由不同数量的空格分隔的一列字符

如何从 R Shiny 的选择菜单中拆分选定的列?

R 使用 tidyr::separate 在最后一个空格字符处拆分字符串

通过R中的列的cumsum拆分data.table