首页 > 解决方案 > 如何在包含部分字符串的数据框中创建列?

问题描述

我的数据框中有一列名为 Sentence,其中包含单词和州名。我有兴趣只获取州的名称,并仅使用这些名称创建一个单独的列。

到目前为止,我已经这样做了:

Pattern = paste0(paste0(".*\\b(", paste0(state.name, collapse="|")), ")\\b.*")

df$state = sub(Pattern, "\\1", df$Sentence)

问题是弗吉尼亚是一个州,但西弗吉尼亚也是。

第一个例子:句子[1] = 我住在西弗吉尼亚州。

第二个例子:句子[2] = 我去过弗吉尼亚一次。

对于这两个示例,我的代码都将使用单词“Virginia”并将其添加到 state 列中。

换句话说,永远不会添加“西弗吉尼亚”这个词。

df <- data.frame(
  Sentence = c('I live in West Virginia.', 'I went to Virginia once.'),
  Result = c('West Virginia', 'Virginia'),
  stringsAsFactors = FALSE
)

#                   Sentence        Result
# 1 I live in West Virginia. West Virginia
# 2 I went to Virginia once.      Virginia

标签: rdataframe

解决方案


您可以使用 a 连接各种搜索字符串,|如下所示。我发现stringi::stri_extract_all在多次点击的情况下,它会自动为您提供最长的匹配。

df <- data.frame(
  Sentence = c('I live in West Virginia.', 'I went to Virginia once.'),
  stringsAsFactors = FALSE
)
df
#>                   Sentence
#> 1 I live in West Virginia.
#> 2 I went to Virginia once.
r <- paste(state.name,collapse = '|')

r
#> [1] "Alabama|Alaska|Arizona|Arkansas|California|Colorado|Connecticut|Delaware|Florida|Georgia|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland|Massachusetts|Michigan|Minnesota|Mississippi|Missouri|Montana|Nebraska|Nevada|New Hampshire|New Jersey|New Mexico|New York|North Carolina|North Dakota|Ohio|Oklahoma|Oregon|Pennsylvania|Rhode Island|South Carolina|South Dakota|Tennessee|Texas|Utah|Vermont|Virginia|Washington|West Virginia|Wisconsin|Wyoming"
library(stringi)

df$State <- unlist(stri_extract_all(df$Sentence,regex = r))

df
#>                   Sentence         State
#> 1 I live in West Virginia. West Virginia
#> 2 I went to Virginia once.      Virginia

reprex 包(v0.3.0)于 2020-02-24 创建


推荐阅读