2017-07-06 4 views
9

Immer noch lernen R, aber ich habe persönlich akzeptiert, dass dies unmöglich ist, und ich hoffe, einer von euch kann mich falsch beweisen.Mittelwert auf Teilmengen einer Teilmenge

Ich suche nach dem Mittelwert für Werte < = 25. Perzentil, und der Mittelwert für Werte> = 75. Perzentil; aber nicht für den gesamten Datensatz. Ich möchte diese Mittel für Teilmengen von Daten finden, aus denen die Perzentile gefunden wurden.

Dies wird Daten erzeugen, die meine eigenen ähnelt:

library(data.table) 
DT <- data.table(V1 <- c('AR','AR','AR','AR','AR','AR','AD','AD','AD','AD','AD','AD','BD', 
         'BD','BD','BD','BX','CX','DX','DX','DD','DD','DD','DD','DR','DR', 
         'DR','DR','DR','DR'), 
       V2 <- c(.12,.02,.03,.22,.44,.09,.11,.17,.15,.26,.29,.27,.16,.16,.02,.12,.02, 
         .03,.22,.44,.09,.11,.17,.15,.26,.29,.27,.16,.16,.02)) 

Sieht aus wie:

V1 V2 
1: AR 0.12 
2: AR 0.02 
3: AR 0.03 
4: AR 0.22 
5: AR 0.44 
6: AR 0.09 
7: AD 0.11 
8: AD 0.17 
9: AD 0.15 
10: AD 0.26 
11: AD 0.29 
12: AD 0.27 
13: BD 0.16 
14: BD 0.16 
15: BD 0.02 
16: BD 0.12 
17: BX 0.02 
18: CX 0.03 
19: DX 0.22 
20: DX 0.44 
21: DD 0.09 
22: DD 0.11 
23: DD 0.17 
24: DD 0.15 
25: DR 0.26 
26: DR 0.29 
27: DR 0.27 
28: DR 0.16 
29: DR 0.16 
30: DR 0.02 

Erster Schritt: Calulate Median, 25. Perzentile, 75. Perzentil und zählen Auftritte jedes A_, B_ , C_, D_. Verstanden:

dt.qtile <- DT[, list(Bottom = quantile(V2, .25), 
         Middle = quantile(V2, .5), 
         Top = quantile(V2, .75), 
       Appearances = .N), by = V1] 

Produziert:

V1 Bottom Middle Top Appearances 
1: AR 0.045 0.105 0.1950   6 
2: AD 0.155 0.215 0.2675   6 
3: BD 0.095 0.140 0.1600   4 
4: BX 0.020 0.020 0.0200   1 
5: CX 0.030 0.030 0.0300   1 
6: DX 0.275 0.330 0.3850   2 
7: DD 0.105 0.130 0.1550   4 
8: DR 0.160 0.210 0.2675   6 

Dies ist, wo ich, es ist unmöglich zu denken. Ich würde gerne die Werte in der ursprünglichen V2 (DT $ V2), die kleiner oder gleich dem Wert des 25. Perzentils sind, dann größer als oder gleich 75. Perzentil für jede Buchstabenkombination in V1.

V1 V2 
1: AR 0.12 - Ignore - 
2: AR 0.02 <= 0.045 \ 
3: AR 0.03 <= 0.045 /mean = 0.05 (Bottom) 
4: AR 0.22 >= 0.1950 \ 
5: AR 0.44 >= 0.1950 /mean = 0.33 (Top) 
6: AR 0.09 - Ignore - 
    ------ 
7: AD 0.11 <= 0.155 > mean = 0.11 (Bottom) 
8: AD 0.17 - Ignore - 
9: AD 0.15 - Ignore - 
10: AD 0.26 >= 0.2675 \ 
11: AD 0.29 >= 0.2675 | mean = 0.2733 (Top) 
12: AD 0.27 >= 0.2675 /
     ... 
25: DR 0.26 - Ignore - 
26: DR 0.29 >= 0.2675 \ 
27: DR 0.27 >= 0.2675 /mean = 0.28 (Top) 
28: DR 0.16 <= 0.16 \ 
29: DR 0.16 <= 0.16  | mean = 0.17 (Bottom) 
30: DR 0.02 <= 0.16 /

Durchschnitt die Werte in V2, die < = 25. Perzentil sind, im Durchschnitt dann die Werte, die> = 75. Perzentil sind.

Die neue Ausgabe sollte in etwa so aussehen:

V1 Bottom Middle Top Appearances 
1: AR 0.025 0.105 0.3300   6 
2: AD 0.110 0.215 0.2733   6 
        ... 
8: DR 0.170 0.210 0.2800   6 

Das bin ich nahe kommt:

DT[V2 < quantile(V2, .25), mean(V2), by = V1] 

Aber es ist die Berechnung der Quantil für den Satz ganze Daten, nicht jede Buchstabenkombination. So

Ich versuche:

DT[V2 < DT[, quantile(V2, .25), by = V1], mean(V2), by = V1] 

ich dieses:

Error in `[.data.table`(DT, V2 < DT[, quantile(V2, 0.25), by = V1], mean(V2), : 
    i is invalid type (matrix). 
Perhaps in future a 2 column matrix could return a list of elements of DT 
(in the spirit of A[B] in FAQ 2.14). 
Please let datatable-help know if you'd like this, or add your comments to FR #657. 

Ich weiß, das einfach sein, aber ich kann einfach nicht sehen. Was vermisse ich? Lass mich wissen, wo ich das klären kann.

Ich schätze Ihre Hilfe im Voraus!

EDIT

DT[, list(Bottom = mean(V2[V2 <= quantile(V2, 0.25)]), 
      Middle = median(V2), 
       Top = mean(V2[V2 >= quantile(V2, 0.75)]), 
     Appearances = .N), by = V1] 

Ich würde nie habe dies auf meinem eigenen gefunden.

Antwort

1
DT[, mean(V2[V2 < quantile(V2, 0.25)]), by = V1] 
    V1 V1 
1: AR 0.025 
2: AD 0.130 
3: BD 0.020 
4: BX NaN 
5: CX NaN 
6: DX 0.220 
7: DD 0.090 
8: DR 0.020 

DT[, mean(V2[V2 > quantile(V2, 0.75)]), by = V1] 
    V1 V1 
1: AR 0.33 
2: AD 0.28 
3: BD NaN 
4: BX NaN 
5: CX NaN 
6: DX 0.44 
7: DD 0.17 
8: DR 0.28 
+0

In Teilen, die Sie erwähnten, wollten Sie '<=' und in anderen verwendeten Sie '<'. Offensichtlich '<' and '>' und für '<=' and '> =' wo erforderlich ausgetauscht werden. –

+0

Segne dich, mein Herr. Ich habe den Code bereits ein oder zwei Mal ausgeführt, und ich werde einen Blick auf meine Daten werfen. Ich melde mich mit den Ergebnissen! – Jake

Verwandte Themen