2013-04-26 10 views
12

Ich versuche, die Minimalwert einer numerischen Spalte für jede Stufe eines Faktors zu berechnen, während Sie die Werte eines anderen Faktors in dem resultierenden Datenrahmen zu halten.Aggregate von Faktorstufen, halten andere Variablen in dem resultierenden Datenrahmen

# dummy data 
dat <- data.frame(
    code = c("HH11", "HH45", "JL03", "JL03", "JL03", "HH11"), 
    index = c("023434", "3377477", "3388595", "3377477", "1177777", "023434"), 
    value = c(24.1, 37.2, 78.9, 45.9, 20.0, 34.6) 
    ) 

Das Ergebnis I ist das Minimum für jede Ebene des value will von code, index in dem resultierenden Datenrahmen zu halten.

# result I want: 
# code value index 
# 1 HH11 24.1 023434 
# 2 HH45 37.2 3377477 
# 3 JL03 20.0 1177777 


# ddply attempt 
library(plyr) 
ddply(dat, ~ code, summarise, val = min(value)) 
# code val 
# 1 HH11 24.1 
# 2 HH45 37.2 
# 3 JL03 20.0 


# base R attempt 
aggregate(value ~ code, dat, min) 
# code value 
# 1 HH11 24.1 
# 2 HH45 37.2 
# 3 JL03 20.0 

Antwort

12

Sie müssen merge auf Ergebnis aggregate und Original verwenden data.frame

merge(aggregate(value ~ code, dat, min), dat, by = c("code", "value")) 
## code value index 
## 1 HH11 24.1 023434 
## 2 HH45 37.2 3377477 
## 3 JL03 20.0 1177777 
+0

schlagen Sie mich durch Sekunden! – Chris

0

Nun, ein paar Minuten mehr Such mich dort bekommen hätte ... this answer den Trick zu tun scheint:

merge (dat, aggregate (Wert ~ code, dat, min))

3

Nur um zu zeigen, dass es immer mehrere gibt Weisen die Haut eine Katze:

ave Mit den Indizes der Mindest Zeilen in jeder Gruppe zu erhalten:

dat[which(ave(dat$value,dat$code,FUN=function(x) x==min(x))==1),] 

# code index value 
#1 HH11 023434 24.1 
#2 HH45 3377477 37.2 
#5 JL03 1177777 20.0 

Diese Methode hat auch den potenziellen Nutzen von in der Instanz von mehreren pro code Gruppe mehrere Zeilen zurückkehr Werte sind das Minimum.

Und eine andere Methode by:

do.call(rbind, 
    by(dat, dat$code, function(x) cbind(x[1,c("code","index")],value=min(x$value))) 
) 
#  code index value 
# HH11 HH11 023434 24.1 
# HH45 HH45 3377477 37.2 
# JL03 JL03 3388595 20.0 
0

Wenn Sie in der Index-Variablen hinzugefügt hatte, die es getan hätte.

library(plyr) 

# ddply 
ddply(dat, .(code,index), summarise, val = min(value)) 

# base R 
aggregate(value ~ code + index, dat, min) 
1

Mit den dplyr und data.table Pakete, können Sie die folgenden Aktionen aus. Sie können einen Index für die Zeile erhalten den Mindestwert für jede Gruppe. Sie können, dass in slice() verwenden, wenn Sie dplyr verwenden. Sie können die gleiche subsetting .SD mit erreichen, wenn Sie data.table verwenden.

library(dplyr) 
library(data.table) 

dat %>% 
group_by(code) %>% 
slice(which.min(value)) 

# code index value 
# <fctr> <fctr> <dbl> 
#1 HH11 023434 24.1 
#2 HH45 3377477 37.2 
#3 JL03 1177777 20.0 

setDT(dat)[, .SD[which.min(value)], by = code] 

# code index value 
#1: HH11 023434 24.1 
#2: HH45 3377477 37.2 
#3: JL03 1177777 20.0 
Verwandte Themen