Stringr 函数 str_extract_all() 突然不适用于我尝试的任何数据集

1 r stringr tidyverse

我重新运行了一些我多年来一直使用的 R 代码,似乎一夜之间它就停止工作了。数据没有任何变化,代码也没有任何变化,但是 R 包 stringr 中的函数 str_extract_all 不再起作用。

\n

数据来自 .txt 文件,该文件是贝叶斯饮食模型的输出。我想把它做成一张桌子,这样我就可以查看个人的饮食。它看起来像这样:

\n

狼队:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n
个人部分
狼1.鹿.50
狼1.麋鹿.30
狼1.驼鹿.20
狼2.鹿.40
狼2.麋鹿.35
狼2.驼鹿.25
\n
\n

我一直使用的创建新食物栏的代码行是:

\n
Wolves$Food <- unlist(\n  str_extract_all(\n    Wolves$Individual, \n    c("Deer", "Elk", "Moose")\n  ), \n  use.names=FALSE\n)\n
Run Code Online (Sandbox Code Playgroud)\n

所以新数据将如下所示:

\n
| Individual | Proportion| Food\n| ---------- | --------- |\n| Wolf1.Deer | .50       | Deer\n| Wolf1.Elk  | .30       | Elk\n| Wolf1.Moose| .20       | Moose\n| Wolf2.Deer | .40       | Deer \n| Wolf2.Elk  | .35       | Elk\n| Wolf2.Moose| .25       | Moose\n
Run Code Online (Sandbox Code Playgroud)\n

然后我就可以按食物组运行统计数据。

\n

但现在我突然得到这个错误: Error in str_extract_all():\n! 无法回收string(尺寸 6)来匹配pattern(尺寸 3)。

\n

这是我正在使用该代码的大约十几个数据集上反复出现的错误,因此我认为这不是数据的问题。我对 R 的了解不够,无法知道该函数的工作实际情况,但任何帮助将不胜感激。

\n

如果有任何用处,当我对错误运行last_trace时,我得到:

\n
\xe2\x94\x9c\xe2\x94\x80base::unlist(...)\n 2. \xe2\x94\x9c\xe2\x94\x80stringr::str_extract_all(Wolves$Individual, c("Deer", "Elk", "Moose"))\n 3. \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80stringr:::check_lengths(string, pattern)\n 4. \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80vctrs::vec_size_common(...)\n 5. \xe2\x94\x94\xe2\x94\x80vctrs::stop_incompatible_size(...)\n 6.   \xe2\x94\x94\xe2\x94\x80vctrs:::stop_incompatible(...)\n 7.     \xe2\x94\x94\xe2\x94\x80vctrs:::stop_vctrs(...)\n 8.       \xe2\x94\x94\xe2\x94\x80rlang::abort(message, class = c(class, "vctrs_error"), ..., call = call)\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过重新安装软件包,重新安装 R,不加载 stringr,只加载 tidyverse。我尝试删除代码的 unlist() 部分。我已经在许多不同的数据集上尝试过,并插入了许多不同的食物名称。一切都无济于事。

\n

Mar*_*cus 5

stringr自 v1.5.0 起更改。根据变更日志,它不再自动回收pattern参数,除非它的长度为一。在将长度为 3 的匹配模式加倍以匹配长度为 6 的数据之前。您需要手动将匹配模式加倍

unlist(
  str_extract_all(
   Wolves$Individual, 
    c("Deer", "Elk", "Moose", "Deer", "Elk", "Moose")
  ), 
  use.names=FALSE
)
Run Code Online (Sandbox Code Playgroud)

或使用单个正则表达式

unlist(
  str_extract_all(
   Wolves$Individual, 
    "Deer|Elk|Moose"
  ), 
  use.names=FALSE
)
Run Code Online (Sandbox Code Playgroud)

或匹配.到最后之后的所有内容

unlist(
  str_extract_all(
   Wolves$Individual, 
    "(?<=\\.).*$"
  ), 
  use.names=FALSE
)
Run Code Online (Sandbox Code Playgroud)