根据条件从数据帧列表中提取数据帧的子列表

extract sublist of dataframes from list of dataframes based on condition

我有一个很大的数据框列表,我想创建包含满足条件的数据框的子列表。列表中的每个数据框都有相同的列名,它们都有一个名为 treatment 的列,其中包含单词 ZEO 或 BLEO。我希望能够编写一个函数或一个单行代码,使我能够提取所有具有 "ZEO" 的数据帧。 (请注意,一个数据帧中只有一种处理,因此 ListofData$dataframe1$treatment 的所有行都等于 ZEO),列表很大(~300 个数据帧),我还有其他变量我希望能够提取。到目前为止,我尝试了这些方法,但它们似乎没有用

cond<- sapply(ListofData, function(x) x$treatment == "ZEO") 
test <- ListofData[(cond)]

数据帧的名称也包含有关处理的信息,这就是我尝试这个的原因,但它returns一个空列表

test<-ListofData[grep('^[Zeo]+',ListofData)]

你能帮我想办法提取我需要的数据帧吗?

使用正则表达式的解决方案应该可行,请参阅此示例:

#example data
ListofData <- list(ZEO1 = data.frame(xx = 1, treatment = "ZEO"),
                   xx1 = data.frame(xx = 2, treatment = "xx"),
                   ZEO2= data.frame(xx = 3, treatment = "ZEO"))

#using regex 
res <- ListofData[ grepl("^[Zeo]+", names(ListofData)) ]
res 
# $ZEO1
#   xx treatment
# 1  1       ZEO
# 
# $ZEO2
#   xx treatment
# 1  3       ZEO

这是另一个使用列值的解决方案,这个 returns 空数据帧,我们使用 nrow 和子集排除:

# using lapply, then filter
res <- lapply(ListofData, function(x) x[ x$treatment == "ZEO", ] )
res <- res[ sapply(res, nrow) > 0 ]
res
# $ZEO1
#   xx treatment
# 1  1       ZEO
# 
# $ZEO2
#   xx treatment
# 1  3       ZEO