2015-08-03 5 views
1

Я в поисках функции, которая будет возвращать строки в dataframe mydataR: подмножеству dataframe на основе списка допустимых уровней факторов

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, но это не совсем то, что я ищу)

EDIT: Функция я только что сделал, чтобы сделать выше, заключается в следующем, но это не так элегантно, так что я был просто интересно если есть уже какие-либо встроенные функции, чтобы делать то, что я хочу:

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 
+3

хмм .. Разве это не просто 'с (MYDATA, MYDATA [group1 == выбор $ group1 & g roup2 == selection $ group2,]) '? –

+1

Или просто 'which (mydata $ group1 == selection [[1]] & mydata $ group2 == selection [[2]])' – SabDeM

ответ

1

Может быть, это помогает:

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

Да, но я был в поиске функции, которая занимала бы любую длину список с условиями выбора, а не только один конкретный пример –

+0

в этом случае 'which (mydata $ group1% in% selection [[1]] & mydata $ group2% in% selection [[2]])' –

+0

Все еще не совсем - вещь заключается в том, что столбцы в моей файловой структуре могут иметь любое имя и могут содержать дополнительные числовые столбцы, т. е. я ищу общую функцию, а не конкретное решение для этого конкретного примера. –

Смежные вопросы