Я в поисках функции, которая будет возвращать строки в dataframe mydata
R: подмножеству 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
хмм .. Разве это не просто 'с (MYDATA, MYDATA [group1 == выбор $ group1 & g roup2 == selection $ group2,]) '? –
Или просто 'which (mydata $ group1 == selection [[1]] & mydata $ group2 == selection [[2]])' – SabDeM