2016-05-05 21 views
0

Ich habe den folgenden CodeR - Mittelwert von bestimmten Abschnitten eines Vektors

mean( myList$scores[ myList$IDs == "1234" ]) 

Das gibt mir die Mittel der Noten für die Person mit der ID 1234.

Angenommen, ich habe eine Liste von ID Zahlen, das ist eine kleine Stichprobe aller ID-Nummern.

testids = c (1234,2345,3456,4567)

Wie kann ich die 4 bedeutet mir zurückkehren zu ändern, um eine Liste, der Mittelwert von 1234 ist der Mittelwert von 2345, der Mittelwert von 3456 und der Mittelwert von 4567.

Ich weiß, ich könnte die TestIDs durchlaufen, aber das ist nicht der beste Weg, um darüber zu gehen.

+0

ich es nicht als Codeabschnitt aus diesem Grunde gelegt habe. Ich habe nur angegeben, dass es 4 Werte gibt. Ich werde es aktualisieren, um zu sein, was es jetzt ist. – Jibril

+0

Sie können Ihren Code in sapply einfügen: 'sapply (testIDs, Funktion (en) mean (myList $ scores [myList $ IDs == s]))' –

Antwort

6

Wie über die folgenden Ansätze (viele andere existieren):

dta <- data.frame(id = rep(letters[1:4], each = 4), x = rnorm(16)) 

aggregate(dta$x, list(dta$id), mean) 
lapply(split(dta$x, dta$id), mean) 
tapply(dta$x, dta$id, mean) 
by(dta$x, dta$id, mean) 

Einige Timings:

Unit: microseconds 
           expr  mean 
aggregate(dta$x, list(dta$id), mean) 892.08428 
lapply(split(dta$x, dta$id), mean) 61.05315 
tapply(dta$x, dta$id, mean)   172.62361 
by(dta$x, dta$id, mean)    421.29666 

Hier ein Edit ist nur zu reflektieren einen Teil der IDs erhalten:

dta <- data.frame(id = rep(letters[1:10], each = 4), x = rnorm(40)) 

indx <- dta$id %in% letters[1:4] 
lapply(split(dta[indx, 2], dta[indx, 1], drop = TRUE), mean) 

Alternativ, die Antwort in den Kommentaren auch den Trick:

sapply(letters[1:4], function(s) mean(dta$x[ dta$id == s ])) 
+1

Sehr wahr, meine Entschuldigung! – Raad

0

Ich würde vorschlagen, die folgenden

by(myList$scores, INDICES = myList$IDs, FUN = mean)[as.character(testIDs)] 
Verwandte Themen