gpt4 book ai didi

regex - 在列表元素的子集上使用 lapply 并返回与 R 中原始长度相同的列表

转载 作者:行者123 更新时间:2023-12-04 23:45:00 24 4
gpt4 key购买 nike

我想使用 lapply 将正则表达式操作应用于列表元素(它们是字符串)的子集,并返回与原始长度相同的列表。列表元素是长字符串(源自读取长文本文件并将段落折叠为单个字符串)。正则表达式操作仅对列表元素/字符串的子集有效。我希望非子集列表元素(字符串)以其原始状态返回。

正则表达式操作是 str_extract来自 stringr包,即我想从较长的字符串中提取子字符串。我根据文件名中的正则表达式模式对列表元素进行子集化。

一个简化数据的例子:

library(stringr)
texts <- as.list(c("abcdefghijkl", "mnopqrstuvwxyz", "ghijklmnopqrs", "uvwxyzabcdef"))
filenames <- c("AB1997R.txt", "BG2000S.txt", "MN1999R.txt", "DC1997S.txt")
names(texts) <- filenames
regexp <- "abcdef"

我事先知道要对哪些字符串应用正则表达式操作,因此我想对这些字符串进行子集化。也就是说,我不想在列表中的所有元素上运行正则表达式,因为这样做会返回一些无效的结果(这在这个简化的例子中并不明显)。

我做了一些天真的努力,例如:
x <- lapply(texts[str_detect(names(texts), "1997")], str_extract, regexp)
> x
$AB1997R.txt
[1] "abcdef"

$DC1997S.txt
[1] "abcdef"

它返回一个只包含找到的子字符串的缩减长度列表。
但我想得到的结果是:
> x
$AB1997R.txt
[1] "abcdef"

$BG2000S.txt
[1] "mnopqrstuvwxyz"

$MN1999R.txt
[1] "ghijklmnopqrs"

$DC1997S.txt
[1] "abcdef"

其中不包含正则表达式模式的字符串以其原始状态返回。

我已告知自己 stringr , lapplyllply (在 plyr 包中),但许多操作使用数据帧作为示例进行说明,而不是列表,并且不涉及字符串上的正则表达式操作。我可以使用 for 循环实现我的目标,但我试图摆脱这种情况,正如通常所建议的那样,并更好地使用应用类函数。

最佳答案

您可以使用子集运算符 [<- :

x <- texts
is1997 <- str_detect(names(texts), "1997")
x[is1997] <- lapply(texts[is1997], str_extract, regexp)
x
# $AB1997R.txt
# [1] "abcdef"
#
# $BG2000S.txt
# [1] "mnopqrstuvwxyz"
#
# $MN1999R.txt
# [1] "ghijklmnopqrs"
#
# $DC1997S.txt
# [1] "abcdef"
#

关于regex - 在列表元素的子集上使用 lapply 并返回与 R 中原始长度相同的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com