R:基于允许因子水平列表的子集数据帧

时间:2015-08-03 09:32:49

标签: r select dataframe subset data-manipulation

我正在寻找能够返回数据框mydata

中的行的函数
mydata=data.frame(group1=c(rep("MALE",6),rep("FEMALE",6)),group2=c(rep("TREATED",3),rep("UNTREATED",3)))
mydata
   group1    group2
1    MALE   TREATED
2    MALE   TREATED
3    MALE   TREATED
4    MALE UNTREATED
5    MALE UNTREATED
6    MALE UNTREATED
7  FEMALE   TREATED
8  FEMALE   TREATED
9  FEMALE   TREATED
10 FEMALE UNTREATED
11 FEMALE UNTREATED
12 FEMALE UNTREATED

哪些列等于特定因子级别,指定为列表

selection=list(group1="MALE",group2="TREATED")

在此示例中,此函数将返回所选行的向量

c(1,2,3)

在不使用循环等的情况下,最简单,最快速的方法是什么?

PS列表selection可以是任意长度,并且我的数据框中可以有任意数量的列。

(我知道subset,但这不是我要找的东西)

编辑:我刚才做的一个功能如下,但它不优雅,所以我只是想知道是否已经有任何内置函数可以做我想要的事情:

mydata=data.frame(group1=c(rep("MALE",6),rep("FEMALE",6)),group2=c(rep("TREATED",3),rep("UNTREATED",3)))
selection=list(group1="MALE",group2="TREATED")

selrows=function(mydata,selection) {
nms=names(selection)
sel=data.frame(matrix(TRUE,nrow=nrow(mydata),ncol=length(nms)))
for (i in 1:length(nms)) { sel[,i]=(mydata[,nms[[i]]]==selection[nms[[i]]][[1]]) }
which(apply(sel*1,1,prod)==1)
}

selrows(mydata,selection)
1 2 3

1 个答案:

答案 0 :(得分:1)

也许这会有所帮助:

which(mydata[,1] %in% unlist(selection) & mydata[,2] %in% unlist(selection))
#[1] 1 2 3