【问题标题】:How to use str_detect() to select rows and then create a new variable based on the pattern it is matched with?如何使用 str_detect() 选择行,然后根据匹配的模式创建一个新变量?
【发布时间】:2019-11-22 18:15:49
【问题描述】:

我有一个几十万行的数据集。以下是它们的外观示例。

  X      user_id     screen_name                name        location
  1 1 1.732895e+09   DROPPSScience   DROPPS Consortium                
  2 2 1.172266e+18    Lamy40283167  Alex lamy precious Washington, USA
  3 3 3.773702e+08         cdockjr      Calvin Wilborn    Alabama, USA
  4 4 7.040063e+07           xmtl2             Felicio                
  5 5 3.929519e+08    DeleceWrites Delece Smith-Barrow  Washington, DC
  6 6 1.130459e+18    evabrooke_26                 Eva                
  7 7 1.067302e+08 MitchellHortert Mitchell R. Hortert   Pittsburgh,PA

我在https://github.com/jasonong/List-of-US-States/blob/master/states.csv找到了第二个数据集

我正在尝试使用 str_detect() 在 states.csv 文件中的“位置”列和任一列之间查找任何匹配项。然后我想创建一个新变量来存储每个观察的匹配模式。

到目前为止,我已经尝试过使用

data.set %>%
    filter(str_detect(location, paste(states$State)

这会返回一些匹配项,但会忽略许多观察结果并给出警告

Warning message:
In stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)) :
longer object length is not a multiple of shorter object length

states$State 是一个因子变量,每个州和 DC 有 51 个级别。 是什么导致了这个警告,只有很少的匹配项,但它在某种程度上有效?

最后,我将如何创建一个基于匹配发生时间的新变量,并将匹配模式放入新变量中?

【问题讨论】:

  • 你尝试过使用 mutate() 吗?

标签: r stringr


【解决方案1】:

如果“位置”和“状态”的长度不同,则可以选择使用paste 中的collapse 来识别每个模式。它充当OR

library(stringr)
library(dplyr)
data.set %>%
    filter(str_detect(location, paste(states$State, collapse = "|")))

由于我们已经在使用stringrstr_c 可以替换paste

data.set %>%
    filter(str_detect(location, str_c(states$State, collapse = "|")))

或者正如@HanselPalencia 提到的,如果“状态”中有混淆,请使用“缩写”列进行模式检测

data.set %>%
  filter(str_detect(location, str_c(states$Abbreviation, collapse = "|")))

【讨论】:

  • 需要注意的是,匹兹堡州是宾夕法尼亚州,所以我们总是必须想办法在必要的地方使用缩写来检测。
  • 要在新变量中获得匹配,您可以使用 mutate() 而不是过滤器,说出mutate(matches =str_detect(location, str_c(states$State, collapse = "|"))) 的效果(取自@Akrun)
  • mutate 函数有效,但新添加的变量是 TRUE 或 FALSE,取决于是否存在匹配项。有没有一种方法可以将导致匹配的模式粘贴到这个新变量中?
  • @Auresm 如果需要解压。模式使用str_extractdata.set %>% mutate(newcol = str_extract(location, str_c(states$Abbreviation, collapse = "|")))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2017-01-25
相关资源
最近更新 更多