2016-11-19 9 views
0

messen Ich möchte IDs auswählen und Durchschnitt von IDs durch eine bestimmte Bedingung. Ich möchte den Durchschnitt aller IDs messen, dieID mit einer bestimmten Bedingung auswählen und Durchschnitt der Werte dieser IDs in R

mdf <- data.frame (id =c(1,2,3,2,1,2), 
factor= c("a","b","a","a","b" ,"a") , value = c(4,0,5,2,3,6)) 



    id factor value 
1 1  a  4 
2 2  b  0 
3 3  a  5 
4 2  a  2 
5 1  b  3 
6 2  a  6 

Zum Beispiel ein bestimmter Faktor mindestens 1 Mal hatte, möchte ich durchschnittlich ids die b als Faktor hatte, id 1 und 2 hatte b als Faktor auf der Liste einmal, So 'mein Code sollte die Werte von ID 1 und ID 2 extrahieren und messen ihren Durchschnitt (4 + 0 + 2 + 3 + 6)/5 = 3. Beachten Sie, dass ID 3 nie b hatte, so dass es wird von der Berechnung ausgeschlossen. so mein idealer Ausgangs

factor avg 
a  3.33 
b  3 
+0

akrun, id 3 nie b hatte, so dass er von der Berechnung ausgenommen wird, nehmen wir durchschnittlich IDs, die in ihrem Faktor mindestens einmal b hatte . Bitte lassen Sie mich wissen, wenn es nicht klar ist, gebe ich mehr Beispiel – MFR

+0

Ja, für die Messung von Durchschnitt, nahm ich den Durchschnitt aller Werte von ID 1 und ID 2, da ID 3 hatte nie b, ich den Wert für ausgeschlossen ID 3. – MFR

+0

Das ist richtig, aber ich habe viele Faktoren, ich kann nicht den Wert für jeden von ihnen separat messen, möchte ich automatisch für alle Faktoren tun – MFR

Antwort

2

Nach der Umwandlung der data.frame-data.table (setDT(mdf)) sein wird, wir eine Schleife durch die unique Elemente von ‚Faktor‘, von ‚id‘ gruppiert, ifany des ‚Faktor‘ haben, dass bestimmtes Element, unterteilen Sie die data.table (.SD), erhalten Sie die mean des 'Wert' und das unique 'Faktor' Element als 2 Spalten 'data.table' und rbind die list Elemente.

library(data.table) 
setDT(mdf) 
rbindlist(lapply(unique(mdf$factor), function(x) { 
     x1 <- mdf[, if(any(factor==x)) .SD, id][, .(factor= x, avg=mean(value))]})) 
# factor  avg 
#1:  a 3.333333 
#2:  b 3.000000 
+0

Vielen Dank @akrun, perfekt. Wenn ich den Durchschnitt der IDs haben möchte, die keinen Faktor haben, kann ich zum Beispiel 'if (any (factor == x))' schreiben, sagen wir, ich möchte die IDs auswählen, die b nicht hatten und nehmen Sie Durchschnitt von ihnen – MFR

+1

@MFR In diesem Fall, vielleicht 'if (alle (Faktor! = x))' – akrun

2

Eine Idee über die Basis R,

fun1 <- function(df, f, include = TRUE){ 
    ind <- unique(df$id[df$factor == f]) 
    if (include == TRUE) { 
    return(mean(df$value[df$id %in% ind])) 
    } else { 
    return(mean(df$value[!df$id %in% ind])) 
    } 
} 

sapply(levels(mdf$factor), function(i) fun1(mdf, i)) 
#  a  b 
#3.333333 3.000000 

sapply(levels(mdf$factor), function(i) fun1(mdf, i, include = FALSE)) 
# a b 
#NaN 5 
Verwandte Themen