从数据框中选择符合条件的一组列

时间:2013-07-11 05:41:12

标签: r subset

我想知道根据某些条件选择列的命令。例如,假设我有一个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

我尝试将子集命令的“select”选项与逻辑运算和colMeans命令组合起来无济于事。我最接近得到这个权利的最接近的是非常复杂。我已经尝试过寻找可以优雅地执行此操作但尚未找到任何命令的命令。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

好的,这有效:

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

关于这一点的好处是,如果在数据框中我们将“Meta1”通过“MetaN”替换为N个随机颜色的名称,如“蓝色”,“靛蓝”,......“芥末”(相应)这仍然有效。即使颜色的数量N未知但我们知道最后一个是“Mustard”,我们只需要做一个小的修改。在使用颜色的示例中,我们只需将“drop”更改为

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

并产生同样的效果。