我重新运行了一些我多年来一直使用的 R 代码,似乎一夜之间它就停止工作了。数据没有任何变化,代码也没有任何变化,但是 R 包 stringr 中的函数 str_extract_all 不再起作用。
\n数据来自 .txt 文件,该文件是贝叶斯饮食模型的输出。我想把它做成一张桌子,这样我就可以查看个人的饮食。它看起来像这样:
\n狼队:
\n| 个人 | 部分 |
|---|---|
| 狼1.鹿 | .50 |
| 狼1.麋鹿 | .30 |
| 狼1.驼鹿 | .20 |
| 狼2.鹿 | .40 |
| 狼2.麋鹿 | .35 |
| 狼2.驼鹿 | .25 |
我一直使用的创建新食物栏的代码行是:
\nWolves$Food <- unlist(\n str_extract_all(\n Wolves$Individual, \n c("Deer", "Elk", "Moose")\n ), \n use.names=FALSE\n)\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n然后我就可以按食物组运行统计数据。
\n但现在我突然得到这个错误: Error in str_extract_all():\n! 无法回收string(尺寸 6)来匹配pattern(尺寸 3)。
这是我正在使用该代码的大约十几个数据集上反复出现的错误,因此我认为这不是数据的问题。我对 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)\nRun Code Online (Sandbox Code Playgroud)\n我尝试过重新安装软件包,重新安装 R,不加载 stringr,只加载 tidyverse。我尝试删除代码的 unlist() 部分。我已经在许多不同的数据集上尝试过,并插入了许多不同的食物名称。一切都无济于事。
\nstringr自 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)
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |