加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 对列表元素的子集使用lapply并返回与R中原始长度

发布时间:2020-12-14 05:56:11 所属栏目:百科 来源:网络整理
导读:我想使用lapply将一个正则表达式操作应用于列表元素的子集(它们是字符串),并返回与原始列表长度相同的列表.列表元素是长字符串(从长文本文件中读取并将段落折叠成单个字符串).正则表达式操作仅对列表元素/字符串的子集有效.我希望非子集化列表元素(字符串)以
我想使用lapply将一个正则表达式操作应用于列表元素的子集(它们是字符串),并返回与原始列表长度相同的列表.列表元素是长字符串(从长文本文件中读取并将段落折叠成单个字符串).正则表达式操作仅对列表元素/字符串的子集有效.我希望非子集化列表元素(字符串)以其原始状态返回.

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

简化数据的示例:

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,lapply和llply(在plyr包中),但许多操作都是使用数据框作为示例而非列表来说明,并且不涉及对字符串的正则表达式操作.我可以使用for循环来实现我的目标,但是我正试图摆脱它,正如通常所建议的那样,并且在使用apply-class函数时会变得更好.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读