通过匹配列表筛选R中的矩阵

通过匹配列表筛选R中的矩阵,r,filter,merge,R,Filter,Merge,我有矩阵: traits <- matrix(c(1,0,1, 1,0,0, 0,0,0), nrow = 3, ncol=3, byrow=TRUE, dimnames = list(c("sp1", "sp2", "sp3"),c("Tr1", "Tr2", "Tr3"))) traits您可以直接使用[子集功能,按存储在species中的行名进行索引: > traits[species, ] Tr1 Tr2 Tr3 sp1 1 0 1

我有矩阵:

traits <- matrix(c(1,0,1, 1,0,0, 0,0,0), nrow = 3, ncol=3, byrow=TRUE,
           dimnames = list(c("sp1", "sp2", "sp3"),c("Tr1", "Tr2", "Tr3")))

traits您可以直接使用
[
子集功能,按存储在
species
中的行名进行索引:

> traits[species, ]
    Tr1 Tr2 Tr3
sp1   1   0   1
sp2   1   0   0

在这种情况下,您是通过字符向量而不是数字索引向量或逻辑向量进行索引。有关更多信息,请参见
?“[”

您可以直接使用
[/code>子集函数按存储在
物种中的行名进行索引:

> traits[species, ]
    Tr1 Tr2 Tr3
sp1   1   0   1
sp2   1   0   0

在本例中,您是通过字符向量而不是数字索引向量或逻辑向量进行索引。有关更多信息,请参见
?“[”

一种明显的方法是使用
物种对
特征
矩阵进行子集划分,如下所示:

traits[species, ]
但是,这仅在假定行名称是唯一的情况下起作用——如果不是唯一的,则只返回第一个匹配项

因此,我强烈建议使用更健壮的:

traits[rownames(traits) %in% species, ]

一种明显的方法是使用
物种
性状
矩阵进行子集划分,如下所示:

traits[species, ]
但是,这仅在假定行名称是唯一的情况下起作用——如果不是唯一的,则只返回第一个匹配项

因此,我强烈建议使用更健壮的:

traits[rownames(traits) %in% species, ]

你可以根据矩阵的行名对矩阵进行索引。在你的例子中,试试
traits[species].
Elizabeth,你反复提到数据框,但展示了一个矩阵示例。你能澄清它是哪一个,这样我们/你就可以整理这个问题了。好的观点@GavinSimpson我已经编辑了这个问题,这样我就可以清楚地看到我在使用矩阵和列表。你可以根据矩阵的行名对矩阵进行索引。在你的例子中,试试
traits[species,].
Elizabeth,你反复提到数据框,但展示了一个矩阵示例。你能澄清一下是哪一个,这样我们/你就可以整理这个问题了。好的观点@GavinSimpson我已经编辑了这个问题,这样我就可以清楚地看到,我使用的是一个矩阵,数据框的ListRowName应该是唯一的。当你使用普通func创建两行时例如,row.names会附加序列号,因此我担心您的“更健壮”方法实际上可能更脆弱。啊。他说“dataframe”(实际上是四次)然后使用了矩阵。如果他将使用矩阵,那么你的观点是有效的。Tim P这应该是对我或@ttmaccer答案的评论。对于@DWin的混淆,我很抱歉。我是指整个矩阵,并对我的问题进行了适当的编辑。Tim Ps解决方案非常有效。谢谢you@TimP对不起,“这”应该是“你的答案”。在ttmaccer给出答案数小时后,您的贡献实际上是对该阶段提供的两个答案的最佳性的评论。类似的内容应该作为评论发布,而不是新答案。我应该清楚地说明我所指的内容。数据帧的行名应该是唯一的。当您创建两行时,w对于普通函数,row.names会附加序列号,因此我担心您的“更健壮”方法实际上可能更脆弱。啊。他说“dataframe”(实际上是四次)然后使用了矩阵。如果他将使用矩阵,那么你的观点是有效的。Tim P这应该是对我或@ttmaccer答案的评论。对于@DWin的混淆,我很抱歉。我是指整个矩阵,并对我的问题进行了适当的编辑。Tim Ps解决方案非常有效。谢谢you@TimP对不起,“这”应该是“你的答案”。在ttmaccer给出答案数小时后,您的贡献实际上是对该阶段提供的两个答案的最佳性的评论。类似的内容应该作为评论发布,而不是新答案。我应该清楚地说明我所指的内容。