2013-06-13 3 views
2

Ниже приведены мои исходные данные ввода и вывода. В принципе, я ищу, чтобы выбрать нижние 1 процентильные записи из нескольких групп столбцов, используя функцию apply в R. Выбор основан на минимальном значении в столбцах a.1, b.1 и c.1 в моих образцовых данных соответственно.Выберите верхние записи n% из разных групп столбцов в dataframe

Я закодировал это вручную для 3 отдельных групп, но задавался вопросом, был ли эффективный способ кодирования с помощью функции apply, ddply?

Я застреваю, пытаясь написать логику. Любые указатели очень ценятся.

> read.csv('in.csv') 
    slno a.1 a.2 a.3 b.1 b.2 b.3 c.1 c.2 c.3 
1 1 10 34 34 14 1 11 5 2 45 
2 2 9 35 35 13 7 17 16 6 46 
3 3 12 11 11 12 5 15 13 4 18 
4 4 13 13 13 11 6 16 12 8 52 
5 5 14 9 9 10 9 19 11 9 36 

> read.csv('out.csv') 
    a.1 a.2 a.3 b.1 b.2 b.3 c.1 c.2 c.3 
1 9 35 35 10 9 19 5 2 45 
2 10 34 34 11 6 16 11 9 36 

Пример кода:

d3.a<- subset(input, a.1 < quantile(a.1, prob = 0.01), 
       select=c(a.1, a.2, a.3)) 
d3.a<-head(arrange(d3.a,desc(a.1)), n=2)    
d3.b<- subset(input, b.1 < quantile(b.1, prob = 0.01), 
       select=c(b.1, b.2, b.3)) 
d3.b<-head(arrange(d3.b,desc(b.1)), n=2)     
d3.c<- subset(input, c.1 < quantile(c.1, prob = 0.01), 
       select=c(c.1, c.2, c.3))    
d3.c<-head(arrange(d3.c,desc(c.1)), n=2) 
out<-cbind(d3.a,d3.b,d3.c) 
+1

не должно быть 'a.1 flodel

+0

Да, спасибо, сделал редактирование .. Был больше искать, как закодировать логику приложения. Я делаю как верхние 1% ile, так и нижние 1% ile в моем фактическом наборе данных ... –

+1

переформатируйте свои данные в длинную форму ..... – mnel

ответ

2

Это даст вам результат в виде списка, и я предлагаю вам сделать это, потому что количество строк может отличаться для переменных a, b, c:

vars <- letters[1:3] ## change this according to your problem. 

L <- lapply(vars, function(x) { 
    y <- input[, paste0(x,".1")] 
    f <- y < quantile(y, prob=0.01) 
    input[f, paste(x, 1:3, sep=".")] 
}) 

Если вы действительно хотите dataframe, используйте:

do.call(cbind, L) 
+0

Спасибо! Я избежал количества разностей строк в моем полном наборе данных, делая голову (order(), n = 200). В основном извлекается постоянное количество строк сверху \ снизу из всех соответствующих групп столбцов. –

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