2013-10-13 2 views
3

у меня есть этот фрейм данных:R извлечь Ith наименьшее значение по значениям одного столбца, для всех уровней другого столбца

> df 
    c1 c2 
1 1 b 
2 2 a 
3 3 a 
4 4 a 
5 3 a 
6 2 b 
7 6 a 
8 4 b 
9 8 b 
10 7 a 

Таким образом, для я = 3, выходной сигнал должен быть 3-низкие значения "c1" для обоих уровней "c2"

c1 c2 
    3 a 
    4 b 

ответ

3

у вас есть различные варианты, один может быть tapply

> df<-read.table(text=" c1 c2 
1 1 b 
2 2 a 
3 3 a 
4 4 a 
5 3 a 
6 2 b 
7 6 a 
8 4 b 
9 8 b 
10 7 a") 
> df 
    c1 c2 
1 1 b 
2 2 a 
3 3 a 
4 4 a 
5 3 a 
6 2 b 
7 6 a 
8 4 b 
9 8 b 
10 7 a 
> tapply(df$c1, df$c2, function(x) sort(x)[3]) 
a b 
3 4 

Или, используя plyr пакет, вы можете:

> library(plyr) 

> ddply(df, .(c2), summarise, c1=sort(c1)[3]) 
    c2 c1 
1 a 3 
2 b 4 
1

Использование data.table

library(data.table) 
dt<-data.table(df1) 
dt[,sort(c1)[3],by=c2] 
    c2 V1 
1: b 4 
2: a 3 
+2

Ключ может быть использован для сортировать почту перед отправкой на почтамт: ' SetKey (ДТ, с2, с1); DT [, c1 [3], от = с2] '. Включение «c2» в ключ просто гарантирует, что a приходит до b в результате. – Frank

+1

Спасибо за понимание @Frank – Metrics

4

По существу вариацию на тему:

aggregate(c1 ~ c2, df, function(x) sort(x)[3]) 
# c2 c1 
# 1 a 3 
# 2 b 4 
+0

Я всегда говорю себе: «Вы должны использовать больше формулы в своем коде» :). +1 – Michele

+1

+1 - для скоростей, предполагая много строк, вы можете выполнить сортировку (x, partial = 3) [3] ' – flodel

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