【发布时间】:2021-04-18 20:57:11
【问题描述】:
我的实际案例是一个组合标题字符串和相应数据作为子列表的列表;我希望对列表进行子集化以返回子列表列表,即相同的结构,仅包含其标题字符串包含与字符向量中的字符串匹配的字符串的子列表。
测试数据:
lets <- letters
x <- c(1,4,8,11,13,14,18,22,24)
ls <- list()
for (i in 1:9) {
ls[[i]] <- list(hdr = paste(lets[x[i]:(x[i]+2)], collapse=""),
data = seq(1,rnd[i]))
}
filt <- c("bc", "lm", "rs", "xy")
生成一个结果列表,由以下方式返回:
logical_match <- c(T, F, F, T, F, F, T, F, T)
ls_result <- ls[logical_match]
所以我寻求的函数是:ls_result
我看过:subset list by dataframe; partial match with %in%; nested sublist by condition; subset list by logical condition;而且,我最喜欢的extract sublist elements to array - 这使用了一些简洁的 purr 和 dplyr 解决方案,但不幸的是,这些都不可行,因为我正在寻找一个基本的 R 解决方案来使部署更加简单(我欢迎扩展的 R 解决方案,当然是为了兴趣)。
我猜测logical_match 的一些变体
请问有人可以让我走上正轨吗?
编辑: 当 agrepl() 应用于真实数据时,这变得更加棘手;标头字符串 hdr 通常为 255 个字符长,而过滤器向量的字符串元素 filt 大约为 16 个字符。对于下面的示例,0.1 的默认 agrepl() max.distance 参数需要调整到 0.94 到 0.96 之间,这非常严格。即使我使用该范围的下限,并将其应用于 ~360 个列表元素,该函数也会返回总不匹配的负载。
> hdr <- "#CCHANNELSDI12-PTx|*|CCHANNELNO2|*|CDASA1570|*|CDASANAMEShenachieBU_1570|*|CTAGSODATSID|*|CTAGKEYWISKI_LIVE,ShenachieBU_1570,SDI12-PTx,Highres|*|LAYOUT(timestamp,value)|*|RINVAL-777|*|RSTATEW6|*|RTIMELVLhigh-resolution|*|TZEtc/GMT|*|ZDATE20210110130805|*|"
> filt <- c("ShenachieBU_1570", "Pitlochry_4056")
> agrepl(hdr, filt, max.distance = 0.94)
[1] TRUE FALSE
【问题讨论】:
标签: r string list vector subset