【发布时间】:2015-08-03 09:32:49
【问题描述】:
我正在寻找一个函数来返回数据框中的行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
【问题讨论】:
-
嗯..这不就是
with(mydata, mydata[group1 == selection$group1 & group2 == selection$group2, ])吗? -
或者只是一个
which(mydata$group1 == selection[[1]] & mydata$group2 == selection[[2]])
标签: r select dataframe subset data-manipulation