2

我想知道根据某些标准选择列的命令。例如,假设我有一个 N+5 列数据框(其中 N 是任意/未知),如下所示:

>mydf
Name  Meta1 Meta2 ... MetaN A B C D
Alice a1    a2    ... aN    1 0 1 0 
Bob   b1    b2    ... bN    2 1 2 1

我想通过使用 A 和 C 的列均值大于 1(或等效地 B 和 D 的列均值小于 1)这一事实来获得下面的数据框。

>mydf
Name  Meta1 Meta2 ... MetaN A C
Alice a1    a2    ... aN    1 1 
Bob   b1    b2    ... bN    2 2

我尝试将子集命令的“选择”选项与逻辑操作和 colMeans 命令结合使用,但无济于事。总的来说,我最接近做到这一点的方法非常复杂。我尝试寻找可以优雅地执行此操作的命令,但还没有找到。

编辑:列名“Meta1”到“MetaN”应该被认为是占位符,不一定是列的实际名称。出于所有意图和目的,它们可以是 N 个随机颜色名称。

4

2 回答 2

3

有几种直接的方法。您可以在colMeans此处使用该功能。这假设你data.frame的名字叫做“mydf”。

> mydf[c("Name", names(which(colMeans(mydf[-1]) > 1)))]
   Name A C
1 Alice 1 1
2   Bob 2 2
于 2013-07-11T05:44:22.870 回答
2

好的,这有效:

drop <- names(which(colMeans(mydf[-c(1, N+1)])<1))
mydf[!(colnames(mydf) %in% drop)]

这样做的好处是,如果在数据框中,我们将“Meta1”到“MetaN”替换为 N 种随机颜色的名称,如“Blue”、“Indigo”、...“Mustard”(分别),这仍然会工作。即使颜色 N 的数量未知,但我们知道最后一种是“芥末”,我们只需要稍作修改即可。在使用颜色的示例中,我们只需将“drop”更改为此,

drop <- names(which(colMeans(mydf[-c(1, which(colnames(mydf)=="Mustard")])<1))

并产生相同的效果。

于 2013-07-12T02:38:33.307 回答