我有一个很大的数据帧列表,我想创建包含满足条件的数据帧的子列表。列表的每个数据框都具有相同的列名,并且它们都有一个称为treatment的列,其中包含单词ZEO或BLEO。我希望能够编写一个函数或单行代码,使我能够提取所有具有“ ZEO”的数据框。 (请注意,一个数据帧中只有一种处理,因此ListofData $ dataframe1 $待遇的所有行都等于ZEO),列表很大(〜300个数据帧),我还有其他一些我想能够做的变量提取。到目前为止,我尝试了这些方法,但是它们似乎没有作用
cond<- sapply(ListofData, function(x) x$treatment == "ZEO")
test <- ListofData[(cond)]
数据框的名称还包含有关处理的信息,这就是我尝试此操作的原因,但是它返回一个空列表
test<-ListofData[grep('^[Zeo]+',ListofData)]
能否请您帮我找到一种提取所需数据帧的方法?
答案 0 :(得分:0)
使用正则表达式的解决方案应该可行,请参见以下示例:
#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
这里是使用列值的另一种解决方案,它返回空的数据帧,我们排除使用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