r - 如何在包含部分字符串的数据框中创建列?
问题描述
我的数据框中有一列名为 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
解决方案
您可以使用 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 创建
推荐阅读
- google-cloud-platform - 无法从外部 IP 访问 GCP 虚拟机实例
- java - Java 在文本中搜索并在其周围返回多行
- javascript - 使用 XMLHttpRequest 从 sql 获取 json
- angular - 星云树网格分层过滤或排序
- c# - C# MongoDB 驱动程序:唯一索引
- for-loop - 如何使用 for 命令存储 jpg 图像尺寸,将结果存储在 var 中,并在 imagemagick 命令行中使用 var
- java - Thread.currentThread() 方法会在 Runnable 的整个生命周期中始终返回相同的对象吗?
- google-apps-script - 获得运行宏的权限
- python - 如何在熊猫数据框中解压缩不同长度的元组列表?
- javascript - Puppeteer - 如何根据内部文本选择元素?