具有不同列名和多个选择的数据帧列表上的子集

时间:2017-03-01 05:25:47

标签: r

给定具有唯一列名称的数据帧列表,最终目标是提取行,其中这些列按顺序匹配每个数据帧的条件。例如:

Sp1<-c("Elm","Maple","Oak")
Sp2<-c("Elm", "Aspen", "Oak")
Height1<-c(2,4,6)
Height2<-c(4,6,8)
Site_1<-data.frame(Sp1,Height1)
Site_2<-data.frame(Sp2,Height2)
Tree_List<-list(Site_1=Site_1,Site_2=Site_2)

现在开始我知道如果我执行以下代码,它将为单个选择返回所需的输出:

subset(Tree_List[[1]], Tree_List[[1]][1]=="Elm")

我也知道如果我按照其特定名称调用列,我可以提取多个选择的所需输出:

subset(Tree_List[[1]], Sp1 %in% c("Elm","Oak"))

由于我在列表中的所有数据帧上使用for循环迭代,列号相同但列名不同,我的尝试是:

subset(Tree_List[[1]], Tree_List[[1]][1] %in% c("Elm","Oak"))

这很遗憾地返回

的输出
<0 rows> (or 0-length row.names)

而不是所需的输出。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用lapply来循环list data.frame和subset

lapply(Tree_List, function(x) x[x[,1] %in% c("Elm", "Oak"),])

关于OP代码中的问题,Tree_List[[1]][1]仍然是data.frame,其中包含一列。我们需要将列提取为vector

subset(Tree_List[[1]], Tree_List[[1]][,1] %in% c("Elm","Oak"))
#  Sp1 Height1
#1 Elm       2
#3 Oak       6