子集R列表,通过子列表元素与字符向量的部分字符串匹配,使用基R

子集R列表,通过子列表元素与字符向量的部分字符串匹配,使用基R,r,string,list,vector,subset,R,String,List,Vector,Subset,我的实际案例是一个组合标题字符串和相应数据作为子列表的列表;我希望将列表子集以返回子列表列表,即相同的结构,其中仅包含其标题字符串包含与字符向量中的字符串匹配的字符串的子列表 测试数据: 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="

我的实际案例是一个组合标题字符串和相应数据作为子列表的列表;我希望将列表子集以返回子列表列表,即相同的结构,其中仅包含其标题字符串包含与字符向量中的字符串匹配的字符串的子列表

测试数据:

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")
让您可以执行以下操作:

Filter(function(x)any(agrepl(x$hdr,filt)), ls)
您可以将代码简化为:

Filter(function(x)grepl(paste0(filt, collapse = "|"), x$hdr), ls)
你可以做:

Filter(function(x)any(agrepl(x$hdr,filt)), ls)
您可以将代码简化为:

Filter(function(x)grepl(paste0(filt, collapse = "|"), x$hdr), ls)
我们也可以这样做

library(purrr)
library(stringr)
keep(ls, ~ str_detect(.x$hdr, str_c(filt, collapse = "|")))
-输出

#[[1]]
#[[1]]$hdr
#[1] "abc"

#[[1]]$data
#[1] 1


#[[2]]
#[[2]]$hdr
#[1] "klm"

#[[2]]$data
#[1] 1 2 3 4


#[[3]]
#[[3]]$hdr
#[1] "rst"

#[[3]]$data
#[1] 1 2 3 4 5 6 7


#[[4]]
#[[4]]$hdr
#[1] "xyz"

#[[4]]$data
#[1] 1 2 3 4 5 6 7 8 9
我们也可以这样做

library(purrr)
library(stringr)
keep(ls, ~ str_detect(.x$hdr, str_c(filt, collapse = "|")))
-输出

#[[1]]
#[[1]]$hdr
#[1] "abc"

#[[1]]$data
#[1] 1


#[[2]]
#[[2]]$hdr
#[1] "klm"

#[[2]]$data
#[1] 1 2 3 4


#[[3]]
#[[3]]$hdr
#[1] "rst"

#[[3]]$data
#[1] 1 2 3 4 5 6 7


#[[4]]
#[[4]]$hdr
#[1] "xyz"

#[[4]]$data
#[1] 1 2 3 4 5 6 7 8 9

整洁的agrep1()相当神秘。那么为什么这是
agrepl(x$hdr,filt)
而不是
agrepl(filt,x$hdr)
?filt是要匹配的模式,x$hdr是“查找匹配的字符向量”。如果我反转参数(看起来像是在文档后面),它会生成错误:参数“pattern”的长度大于1,并且只有第一个元素将被使用
Filter(函数(x)any(agrepl(x$hdr,filt)),ls)
any()就像一个向量或函数;语义上:通过任何hdr值模糊匹配filtNeat来过滤ls!agrep1()相当神秘。那么为什么这是
agrepl(x$hdr,filt)
而不是
agrepl(filt,x$hdr)
?filt是要匹配的模式,x$hdr是“查找匹配的字符向量”。如果我反转参数(看起来像是在文档后面),它会生成错误:参数“pattern”的长度大于1,并且只有第一个元素将被使用
Filter(函数(x)any(agrepl(x$hdr,filt)),ls)
any()就像一个向量或函数;语义上:通过与filtTidy模糊匹配的任何hdr值过滤ls!“str_detect(string,pattern,negate=FALSE):在string和pattern上矢量化”;那么为什么我们需要将filt向量折叠为单个字符串呢?(来自doc'n)
keep()
类似于
Filter()
,但是参数顺序更方便,谓词函数.p的计算更严格。我喜欢这个解决方案,但它不是我选择的解决方案,只是因为它使用的扩展库超出了base R。谢谢。@jack_sprat关于您的查询,有一个条件,字符串和模式长度应该相同。相等字符串和模式长度:谢谢-从文档中我看不出这一点@杰克·斯普拉特你可以试试看!“str_detect(string,pattern,negate=FALSE):在string和pattern上矢量化”;那么为什么我们需要将filt向量折叠为单个字符串呢?(来自doc'n)
keep()
类似于
Filter()
,但是参数顺序更方便,谓词函数.p的计算更严格。我喜欢这个解决方案,但它不是我选择的解决方案,只是因为它使用的扩展库超出了base R。谢谢。@jack_sprat关于您的查询,有一个条件,字符串和模式长度应该相同。相等字符串和模式长度:谢谢-从文档中我看不出这一点@杰克·斯普拉特你可以试试