[英]selecting dataframes from a list based on column values
我使用R,仅在其中一列中存在特定值组合时,才尝试通过从现有列表中选择数据框来创建数据框的新列表。 让我解释一下可以正常工作的第一步。 这是我在名为df的数据框中的原始数据:
Taxon C N func.group trophic.grp
1 Chrysomelidae.Phylotreta.exclamationis -30.23 5.06 grazer herbivore
2 Chrysomelidae.Neocrepidodera.sp. -27.29 5.55 grazer herbivore
3 Chrysomelidae.Neocrepidodera.sp. -27.84 5.54 grazer herbivore
4 Chrysomelidae.Neocrepidodera.sp. -27.69 4.59 grazer herbivore
5 Mitidulidae.Meligethes.sp. -26.99 5.30 grazer herbivore
6 Chrysomelidae.Phylotreta.sp.2 -28.50 2.40 grazer herbivore
7 Chrysomelidae.Phylotreta.sp.2 -28.36 4.17 grazer herbivore
8 Chrysomelidae.Phylotreta.sp.2 -29.50 3.15 grazer herbivore
9 Chrysomelidae.Phylotreta.sp.2 -27.69 3.72 grazer herbivore
10 Chrysomelidae.Phylotreta.sp.2 -28.22 3.26 grazer herbivore
11 Gastropoda.snail.sp.1 -26.21 3.54 grazer herbivore
12 Gastropoda.snail.sp.1 -27.59 2.61 grazer herbivore
13 Gastropoda.snail.sp.1 -25.10 2.66 grazer herbivore
14 Gastropoda.snail.sp.2 -26.49 2.55 grazer herbivore
15 Gastropoda.snail.sp.4 -27.46 -0.38 grazer herbivore
16 Lepidoptera.Arctidae.Ermine.moth -28.51 2.44 grazer herbivore
17 Curculionidae.Ischapterapion.sp. -29.06 2.19 weevil herbivore
18 Curculionidae.Ischapterapion.sp. -29.27 1.60 weevil herbivore
19 Curculionidae.Ischapterapion.sp. -29.94 2.08 weevil herbivore
20 Curculionidae.Ischapterapion.sp. -29.71 2.16 weevil herbivore
21 Curculionidae.Protapion.sp. -28.45 1.91 weevil herbivore
22 Curculionidae.Protapion.sp. -25.99 0.55 weevil herbivore
23 Curculionidae.Protapion.sp. -28.27 1.52 weevil herbivore
24 Curculionidae.Protapion.sp. -28.01 1.74 weevil herbivore
25 Curculionidae.Protapion.sp. -27.06 0.54 weevil herbivore
26 Curculionidae.Hypera.meles -25.41 3.38 weevil herbivore
27 Curculionidae.Sitona.sp. -27.05 2.01 weevil herbivore
28 Curculionidae.Sitona.sp. -26.70 3.07 weevil herbivore
29 Curculionidae.Sitona.sp. -27.64 2.13 weevil herbivore
30 Curculionidae.Sitona.sp. -27.50 1.47 weevil herbivore
31 Curculionidae.Phylobius.sp. -28.27 2.66 weevil herbivore
32 Curculionidae.Hypera.nigrorostris -25.52 2.43 weevil herbivore
此数据帧(df)包含14个不同的“ Taxon”,其中一些具有多个样本,因此总共有32个样本。 每个分类单元也通过“ func.group”列分类为“放牧者”或“象鼻虫”。
首先,我想从14中随机选择6个分类单元,以实现6个所有可能的组合。因此,可以从14个中选择3003个6个分类单元的组合(随机抽样而不进行替换,顺序并不重要)。 对于每个选定的分类单元,我要包括该分类单元的所有样本。 我使用此代码,效果很好:
combos<-combn(unique(as.character(df$Taxon)), 6)
接下来,我还希望包括所有其他信息列,因此我将使用此额外的代码行,对于所选的每个Taxon,它会添加其他数据列,并且效果很好:
mysamples <- apply(combos, 2, function(vec) df[ df$Taxon %in% vec, ] )
这样我们就解决了我的问题。 从“ mysamples”(现在应该是3003个数据框的列表)中,我要选择所有包含至少一个“ grazer”的分类单元和一个“ weevil”的分类单元的数据框,并将这些数据框存储在一个新列表。
因此,我希望这个新列表仅包含同时包含象鼻虫和放牧者分类单元的数据框。 (每个数据帧中的6个分类单元中有多少是象鼻虫还是掠食者都没有关系,只要一个是掠食者而又是象鼻虫)。
非常感谢,M
试试这个代码
mysamples[unlist(lapply(mysamples,
function(x) !any(is.na(match(levels(df$func.group),
x$func.group)))))]
如果缺少grazer或象鼻虫,则match
返回NA,因此any
将返回TRUE(取反(!)),因此该数据帧将不会用于最后一个
尝试这个。
df.list <- lapply(mysamples,
function(x){if(any(x$func.group=="grazer")&
any(x$func.group=="weevil"))
return(x)})
both <- Filter(Negate(is.null),df.list)
匿名函数将df
作为参数,如果df$func.group
中有象鼻虫and
df$func.group
,则返回df
; 否则返回NULL
。 lapply(...)
将此函数“应用”到列表中的每个df
,返回包含所有所需数据帧以及很多NULLs
df.list
。 第二条语句仅返回列表中不为NULL
那些成员,例如,在df$func.group
具有至少一个象鼻虫和至少一个df$func.group
的数据帧列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.