首页 > 解决方案 > 如何将字符串的一部分减去到我的数据框中的新变量中?

问题描述

我需要我从一个变量中减去字符串的一部分来创建一个新变量

我有例如

df <- c(" 3 Rue d Argentine 16th arr 75116 Paris France", 
"5 Passage Ruelle 18th arr 75018 Paris France", " 1 Avenue Carnot 17th arr 75017 Paris France", "Bis Rue De Vaugirard 6th arr 75006 Paris France", "6 Impasse Marteau 18th arr 75018 Paris France" ," 1 Place De La Sorbonne 5th arr 75005 Paris France", "1 Place Vend me 1st arr 75001 Paris France") 

我想要的是一个减去区的新变量,所以我的新数据框变成

adress: " 3 Rue d Argentine 16th arr 75116 Paris France", 
"5 Passage Ruelle 18th arr 75018 Paris France", " 1 Avenue Carnot 17th arr 75017 Paris France", "Bis Rue De Vaugirard 6th arr 75006 Paris France", "6 Impasse Marteau 2nd arr 75018 Paris France" ," 1 Place De La Sorbonne 5th arr 75005 Paris France", "1 Place Vend me 1st arr 75001 Paris France"

arr: "16th", "18th", "17th", "6th", "2nd", "5th", "1st"       

等任何人都可以帮助我如何在 R 中做到这一点?

标签: rregexstringsplitgsub

解决方案


基本 R 方法可以是:

unlist(regmatches(df, gregexpr("\\b(\\S+)(?=\\sarr)", df, perl=TRUE)))
# [1] "16th" "18th" "17th" "6th"  "18th" "5th"  "1st" 

在这里使用gsub可能是一个错误,因为如果arr找不到,那么它将返回整个字符串。

如果您更愿意使用stringr,那么

stringr::str_extract(df, "\\b(\\S+)(?=\\sarr)")
# [1] "16th" "18th" "17th" "6th"  "18th" "5th"  "1st" 

两个正则表达式都使用“前瞻”。模式分解:

  • \\b词界;这不包括任何字符,它确保其左侧和/或右侧的模式在此处有一些空格
  • (\\S+)一个或多个 ( +) 非空格字符 ( \\S)
  • (?=\\sarr)是一个前瞻,确保在所需的模式之后找到封闭的文本(\\s是一个空格,和文字),但它不是“消耗的”;使用这个需要arrperl=TRUE

使用基本 R 版本,gregexpr返回在输入的每个元素中找到模式的索引列表 ( df),并且可用于提取(如此处)甚至替换 ( `regmatches<-`)。


推荐阅读