2016-04-16 18 views
0

Stellen Sie sich eine DatentabelleR - data.table - Berechnen durchschnittlichen Punktzahl von Uniq-Spalten Durchschnittswert

ID Score 
1  10 
1  13 
1  12 
2  10 
3  6 
3  6 

Die average diese Tabelle ist 9,5. Das ist einfach genug, um mean zu verwenden.

Was ist, wenn ich den Durchschnitt des Durchschnitts für jeden einzelnen Benutzer wollte?

Der Durchschnittswert für Benutzer 1 ist 11,67. Der Durchschnitt für Benutzer 2 ist 10. Der Durchschnitt für Benutzer 3 6.

Die UniqAverage ich suche wäre ((11.67+10+6)/3) = 9.223`

Dieses einfach genug sein würde, eine Schleife zu tun verwenden, aber mit Mein riesiger Datensatz Ich möchte meine Bemühungen fortsetzen, Dinge zu lernen, die "richtige" Art und Weise in R machen, indem ich Vektoren benutze.

Wir können sogar annehmen, dass ich bereits eine Variable namens Uniq habe, in der die Anzahl der Uniq-IDs enthalten ist, wenn das hilft.

Für Replikationszwecke zu verwenden, fühlen Sie sich frei ...

library(data.table) 
df = data.frame(ID=c(1,1,1,2,3,3), Score1=c(10,13,12,10,6,6)) 
dt = data.table(df) 

meisten Mein gescheiterter Versuch vor kurzem war

mean(dt[ unique(dt$ID), Score1]) 

dachte ich, dass das Mittel von Score1 für jede ID nehmen würde, aber es didn Es klappt nicht. Ich habe das Ergebnis 11.67 was falsch ist.

+2

Ich würde vorschlagen, dass Sie die durch [Vignetten] (https://github.com/Rdatatable/data.table/wiki/Getting-started). – Arun

+0

Wird tun, danke schön. – Jibril

Antwort

3

Insgesamt bedeuten:

dt[,mean(Score1)]; 
## [1] 9.5 

Mittelwert von ID:

dt[,mean(Score1),ID]; 
## ID  V1 
## 1: 1 11.66667 
## 2: 2 10.00000 
## 3: 3 6.00000 

Durchschnittliche Mittel:

dt[,mean(Score1),ID][,mean(V1)]; 
## [1] 9.222222 
+0

Fantastisch! Um zu lernen, lass mich eine kurze Frage stellen. Was genau bedeutet diese Notation im zweiten Block? dt [, mean (Score1)] Ich nehme an, alle Zeilen, Mittelwert von Score1, zurückzugeben. Was macht die ID? Das scheint, als ob Sie dann zu viele Argumente verwenden. – Jibril

+0

Das dritte Argument 'by' gruppiert die Eingabe nach einer oder mehreren Spalten, dh das zweite Argument' j' wird für jede Gruppe einmal ausgewertet. Weitere Informationen finden Sie in der Dokumentation unter https://cran.r-project.org/web/packages/data.table/data.table.pdf#page=4. – bgoldst

+0

Vielen Dank! Akzeptiert Ihre Antwort, sobald der Timer abgelaufen ist. – Jibril

1

Mit dplyr

library(dplyr) 
res <- dt %>% 
     group_by(ID) %>% 
     summarise(Mean = mean(Score1)) 
res 
# ID  Mean 
# (dbl) (dbl) 
#1  1 11.66667 
#2  2 10.00000 
#3  3 6.00000 

Durchschnittliche Mittel

res %>% 
    .$Mean %>% 
    mean 
#[1] 9.222222