R语言求助:如何筛选包含特定字符的字符串向量列表?
解决R中context函数报错的列表筛选问题
我有一个字符串向量列表strophlist,想要用它运行以下代码:
for(i in 1:length(strophlist)){ strophlist[[i]] |> as.vector() |> context(open="(", close=")") -> melislist[[i]] }
尝试用lapply替代循环时,出现了argument of length 0错误,确认是部分子向量不符合context函数的运行条件,需要移除这些无效向量。但用以下两种方法筛选后都只得到空列表:
strophlist[grep("^\\(.*", strophlist)] Filter(function(x) all("^\\(.*" %in% x), strophlist)
附strophlist数据:
strophlist <- list(`aus-tiefer-not-1535` = structure(c("2b", "4e", "4b", "4cc", "4b", "4g", "4a", "4b", "8r", "8b", "4cc", "4dd", "4cc", "4a", "(4g", "4f)", "4e", "2b", "4e", "4b", "4cc", "4b", "4g", "4a", "4b", "8r", "8b", "4cc", "4dd", "4cc", "4a", "(4g", "4f)", "4e", "8r", "8a", "4g", "4cc", "4b", "8a", "(4dd", "8cc)", "4b", "4a", "8r", "8cc", "4b", "4cc", "4dd", "4g", "8Lb", "8Jcc", "4a", "4g", "8r", "8g", "4cc", "4b", "4a", "4e", "(4g", "4f)", "1e"), visible = TRUE), `Christ-lag-in-todesbanden-1524` = structure(c("2a", "4g", "4a", "4cc", "4dd", "(4cc", "4b)", "4a", "4r", "4a", "4f", "4g", "4a", "8Lg", "8Jf", "4e", "2d", "2a", "4g", "4a", "4cc", "4dd", "(4cc", "4b)", "4a", "4r", "4a", "4f", "4g", "4a", "8Lg", "8Jf", "4e", "2d", "4r", "4d", "4f", "4g", "4f", "4g", "4a", "8r", "8a", "4dd", "4cc", "(4dd", "4ee)", "4cc", "4b", "4a", "8r", "4a", "4cc", "4a", "4cc", "4g", "(8Lf", "8Jd", "4e)", "4d", "4a", "8Lg", "8Jf", "4e", "1d"), visible = TRUE), `ein-feste-burg-1535` = structure(c("2r", "4r", "4ff", "2ff", "2ff", "2cc", "4dd", "(2ff", "4ee)", "2dd", "2cc", "4r", "4ff", "2ee", "2dd", "2cc", "4dd", "(2b-", "4a", "2g)", "2f", "2r", "4r", "4ff", "2ff", "2ff", "2cc", "4dd", "(2ff", "4ee)", "2dd", "2cc", "4r", "4ff", "2ee", "2dd", "2cc", "4dd", "(2b-", "4a", "2g)", "2f", "4r", "4f", "(4.a", "8b-", "4cc)", "(2dd", "2cc)", "4b", "2cc", "2f", "2cc", "2dd", "2ee", "2ff", "2r", "2ee", "2ff", "2ee", "2dd", "2cc", "2dd", "2dd", "4cc", "2dd", "4cc", "2a", "4r", "4ff", "2ee", "2dd", "2cc", "4dd", "(2b", "4a", "2g)", "0;f"), visible = TRUE), `Erschienen-ist-der-herrlich-tag-1560` = structure(c("4d", "4d", "4d", "2a", "4b", "(4.cc", "8b)", "4a", "2g", "4a", "2b", "4cc", "2dd", "4a", "(4.cc", "16Lb", "16Ja)", "4b", "2a", "4b", "2cc", "4a", "2g", "4f", "(4.a", "8g)", "4f", "2g", "4g", "2cc", "4dd", "2ee", "4dd", "2cc", "4gg", "2ee", "4dd", "(2cc", "2dd)", "4b", "2a"), visible = TRUE), `es-ist-das-heil-uns-kommen-her-1524` = structure(c("4r", "8r", "8dd", "4dd", "4dd", "4dd", "4ff", "4ee", "4dd", "4cc", "8r", "8dd", "4b", "4g", "4b", "4cc", "(4dd", "4ee)", "4dd", "4r", "8r", "8dd", "4dd", "4dd", "4dd", "4ff", "4ee", "4dd", "4cc", "8r", "8dd", "4b", "4g", "4b", "4cc", "(4dd", "4ee)", "4dd", "8r", "8dd", "4.gg", "8.ff", "4ee", "4dd", "4gg", "4ee", "4dd", "8r", "8dd", "4.gg", "8cc", "4dd", "4g", "4b", "4dd", "4b", "8r", "8g", "4a", "4cc", "4b", "4a", "(4e", "4a)", "1;g"), visible = TRUE), `lobt-gott-ihr-christen-alle-gleich-1554` = structure(c("2r", "4r", "4f", "4cc", "4cc", "4cc", "4cc", "4ee", "8Lcc", "8Jb-", "4a", "4a", "4b-", "4cc", "4dd", "4dd", "2cc", "4r", "4cc", "4cc", "4cc", "4cc", "4a", "4cc", "8Lb-", "8Ja", "4g", "4cc", "4a", "8Lg", "8Jf", "4g", "4g", "2f", "2a", "2cc", "8Lb-", "8Ja", "4g", "4g", "1f"), visible = TRUE), `Nun-komm-der-heiden-heiland-1524` = structure(c("4g", "4g", "4f", "4b-", "8aL", "8gJ", "4a", "2g", "4g", "4b-", "4.cc", "8b-", "4cc", "4dd", "2b-", "4b-", "4cc", "4dd", "4b-", "4cc", "8Lb-", "8Ja", "2g", "4g", "4g", "4f", "4b-", "8La", "8Jg", "4a", "0g"), visible = TRUE), `nun-lob-mein-seel-den-herrn-1530` = structure(c("2r", "2r", "2g", "1b-", "2a", "1g", "2f", "(1b-", "2cc)", "1dd", "2dd", "1dd", "2dd", "1dd", "2cc", "1b-", "2a", "1b-", "2r", "2r", "2g", "1b-", "2a", "1g", "2f", "(1b-", "2cc)", "1dd", "2dd", "1dd", "2dd", "1dd", "2cc", "1b-", "2a", "1b-", "2r", "2r", "2b-", "1b-", "2dd", "1cc", "2dd", "(2b-", "1a)", "1g", "2g", "1cc", "2cc", "(1cc", "2a", "2b-)", "1g", "1f", "2r", "2r", "2f", "1b-", "2b-", "1cc", "2cc", "1dd", "1b-", "2b-", "1ee", "2ee", "1dd", "2dd", "1cc", "2r", "2r", "2cc", "1dd", "2dd", "1ee-", "2ee", "1ff", "1b-", "2dd", "1cc", "2f", "2a", "1g", "1f", "2r", "2f", "1b-", "2b-", "1a", "2g", "1cc", "1cc", "2dd", "1ee-", "2dd", "(2.b-", "4a", "4b-", "4cc)", "1cc", "0b-"), visible = TRUE), `vom-himmel-hoch-da-komm-1539` = structure(c("4r", "8r", "8f", "4cc", "4cc", "4dd", "4cc", "4a", "8Lb-", "8Jg", "8r", "8f", "4cc", "4cc", "4cc", "8aL", "8Jb-", "8Lcc", "16b-", "16Ja", "4g", "4f", "8r", "8f", "4f", "4g", "4a", "4a", "4f", "4g", "4a", "8r", "8f", "4cc", "4cc", "4cc", "8La", "8Jb-", "8Lcc", "16b-", "16Ja", "4g", "1f"), visible = TRUE), `wach-auf-deutsches-land-16jhd` = structure(c("1f", "2a", "2b-", "2cc", "2cc", "2dd", "2dd", "1cc", "2r", "2cc", "2dd", "2ee", "2ff", "2ff", "(2ee", "4dd", "4cc", "1ee)", "1cc", "1f", "2a", "2b-", "2cc", "2cc", "2dd", "2dd", "1cc", "2r", "2cc", "2dd", "2ee", "2ff", "2ff", "(2ee", "4dd", "4cc", "1ee)", "1cc", "2r", "2cc", "1ff", "1cc", "1.ff", "2ee", "(2.dd", "4cc", "2b-)", "2b-", "1a", "2r", "2a", "1cc", "2cc", "1dd", "2cc", "2dd", "2ee", "1ff", "2r", "2ff", "1ff", "2cc", "2dd", "2a", "(2.cc", "4b-", "2a", "4g", "4f", "1g)", "0f" ), visible = TRUE))
问题分析
之前的筛选方法无效的原因:
strophlist[grep("^\\(.*", strophlist)]:grep直接作用于列表时,会把整个列表转换为字符形式(比如变成"c(\"2b\", \"4e\", ...)"这样的字符串),而不是检查每个子向量中的元素,自然匹配不到目标内容。Filter(function(x) all("^\\(.*" %in% x), strophlist):这里有两个错误,一是%in%是精确字符串匹配,不支持正则表达式;二是all()要求子向量中所有元素都符合规则,但你的数据里只有部分元素带括号,不符合实际需求。
解决方案
方案1:直接测试函数运行有效性
用tryCatch捕获错误,保留能让context函数正常运行的子向量:
# 筛选可正常运行context的列表元素 filtered_strophlist <- Filter(function(x) { success <- tryCatch({ x |> as.vector() |> context(open="(", close=")") TRUE }, error = function(e) FALSE) success }, strophlist)
方案2:提前检查括号配对情况
如果context函数需要子向量中存在配对的括号,可以先检查每个子向量是否包含至少一个左括号和右括号:
# 筛选包含至少一个(和)的子向量 filtered_strophlist <- Filter(function(x) { has_open <- any(grepl("\\(", x)) has_close <- any(grepl("\\)", x)) has_open && has_close }, strophlist)
验证使用
筛选完成后,用lapply运行目标代码即可:
melislist <- lapply(filtered_strophlist, function(x) { x |> as.vector() |> context(open="(", close=")") })
内容的提问来源于stack exchange,提问作者IMIAD
相关产品推荐
相关产品推荐

