Note我已经读了Split string at first occurrence of an integer in a string,但是我的要求不同,因为我想使用R.

假设我有以下示例数据框:

> df = data.frame(name_and_address =
      c("Mr. Smith12 Some street",
        "Mr. Jones345 Another street",
        "Mr. Anderson6 A different street"))
> df
                  name_and_address
1          Mr. Smith12 Some street
2      Mr. Jones345 Another street
3 Mr. Anderson6 A different street

我想在第一次出现整数时拆分字符串.请注意,整数的长度是不同的.

所需的输出可以如下所示:

[[1]]
[1] "Mr. Smith"
[2] "12 Some street",

[[2]]
[1] "Mr. Jones"
[2] "345 Another street",

[[3]]
[1] "Mr. Anderson"
[2] "6 A different street"

我try 了以下方法,但无法获得正确的正则表达式:

# Attempt 1 (Does not work)
library(data.table)
tstrsplit(df,'(?=\\d+)', perl=TRUE, type.convert=TRUE)

# Attempt 2 (Does not work)
library(stringr)
str_split(df, "\\d+")

推荐答案

你可以使用tidyr::extract:

library(tidyr)
df <- df %>% 
    extract("name_and_address", c("name", "address"), "(\\D*)(\\d.*)")
## => df
##           name              address
## 1    Mr. Smith       12 Some street
## 2    Mr. Jones   345 Another street
## 3 Mr. Anderson 6 A different street

(\D*)(\d.*)正则表达式与以下内容匹配:

  • (\D*)-第1组:任何零个或更多非数字字符
  • (\d.*)-第2组:一个数字,然后是尽可能多的零个或更多字符.

另一个stringr::str_split的解决方案也是可能的:

str_split(df$name_and_address, "(?=\\d)", n=2)
## => [[1]]
## [1] "Mr. Smith"      "12 Some street"

## [[2]]
## [1] "Mr. Jones"          "345 Another street"

## [[3]]
## [1] "Mr. Anderson"         "6 A different street"

(?=\d)正向前瞻在一个数字之前找到一个位置,n=2告诉stringr::str_split最多只能分成两个块.

如果字符串中没有数字,则不返回任何内容的Base R方法:

df = data.frame(name_and_address = c("Mr. Smith12 Some street", "Mr. Jones345 Another street", "Mr. Anderson6 A different street", "1 digit is at the start", "No digits, sorry."))

df$name <- sub("^(?:(\\D*)\\d.*|.+)", "\\1", df$name_and_address)
df$address <- sub("^\\D*(\\d.*)?", "\\1", df$name_and_address)
df$name
# => [1] "Mr. Smith"    "Mr. Jones"    "Mr. Anderson" ""             ""
df$address
# => [1] "12 Some street"          "345 Another street"     
#    [3] "6 A different street"    "1 digit is at the start"         ""                       

an online R demo.这也支持第一个数字是字符串中第一个字符的情况.

R相关问答推荐

确定邻国

替换收件箱的子集(行和列)

使用rlang s arg_match判断函数输入列表

在ggplot的注释表格中突出显示最大值

编码变量a、b、c以匹配来自另一个数据点的变量x

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

自动变更列表

根据文本字符串中的值粘贴新列

如何使用ggplot对堆叠条形图进行嵌套排序?

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

使用rvest从多个页面抓取时避免404错误

在R函数中使用加号

如何根据数据帧中的值从该数据帧中提取值?

如何将网站图像添加到带有极坐标的面包裹条形图?

派生程序包| ;无法检索';return()';的正文

查找所有站点的最小值

删除字符串R中的重复项

减少雨云面之间的间距并绘制所有统计数据点

如何移动点以使它们的打印不重叠

在鼠标悬停时使用Plotly更改geom_point大小