2017-05-15 1 views
2

Ich habe eine Datentabelle mit Faktoren und numerischen Werten. Ich möchte diese Datentabelle unterteilen, um nur die höheren Werte auszuwählen. Die Summe dieser höheren Werte muss 80% der Spaltensumme darstellen.R Subset-Datentabelle mit höheren Werten einer Spalte (so dass die Teilmenge 80% der Spaltensumme darstellt)

Ist das ein eleganter Weg?

Zum Beispiel ist hier eine ungeordnete Datentabelle, ECART_H Spalt den Wert von Interesse enthalten (sum = 10307.08; 0.8*sum = 8245) das subsetting nur Zeile in der Auswahl 3 führen soll: und 4: (sum= 8428) so, dass diese 2 Reihen sind die minimalen Reihen zu wählen, um> 80% der Summe von ECART_H zu sein.

REGROUP FAMILLE  TREND  RMSE ECART_H 
1:  10  A03 48.43853 675.7492 470.45737 
2:  10  A04 61.65814 599.2031 795.08575 
3:  10  H01 269.07728 12004.1214 6974.29642 
4:  10  N01 -170.30563 6282.8133 1455.44291 
5:  10  S01 147.61121 2711.0511 529.22545 
6:  10  D06 13.64792 167.9315 82.57669 
+0

Wie viele Werte werden als höhere Werte betrachtet? Vielleicht "library (zoo); df1 [df1 [, welches (rollsum (ECART_H, 2)> (0.8 * Summe (ECART_H))) + 0: 1]] – akrun

Antwort

2

Eine dplyr Lösung mit cume_dist. Die Mutate wird der Einfachheit halber angezeigt und ich bin mir nicht sicher, ob Sie die Gruppierung benötigen.

df %>% 
    group_by(REGROUP) %>% 
    arrange(ECART_H) %>% 
    mutate(c = cume_dist(ECART_H)) %>% 
    filter(c >= 0.8) 

# REGROUP FAMILLE  TREND  RMSE ECART_H   c 
#  <int> <chr>  <dbl>  <dbl> <dbl>  <dbl> 
# 1  10  N01 -170.3056 6282.813 1455.443 0.8333333 
# 2  10  H01 269.0773 12004.121 6974.296 1.0000000 
2

I tat dies:

df <- df[order(-df$ECART_H),] 

df$cumsum <- cumsum(df$ECART_H) 

df$cumfreq <- cumsum(df$ECART_H)/sum(df$ECART_H) 

df <- df[ (df$cumsum <= 0.8), ] 

Aber diese beiden Werte (Zeile 3: 4 :) und ist 81,8%, was höher ist als 80% beträgt.

0

Ok basierend auf epi99 Antwort mit einigen Modifikationen: von größerem Wert zu kleinerem Wert arrangiert, dann eine cumsum ausführen, anstatt eine cumdist, dann filtern.

So habe ich nur die ersten Zeilen, die im Wert 80% der Summe aller Werte darstellen. (Dies ist zum Beispiel auf Pareto‘Methode Art und Weise zu arbeiten und konzentrieren sich auf, was wichtig ist)

test <- dfCONSO_FAM_TREND %>% 
    group_by(REGROUP) %>% 
    filter(ECART_H>0) %>% 
    arrange(-ECART_H) %>% 
    mutate(pc=ECART_H/sum(ECART_H)*100) %>% 
    mutate(pcCUM=cumsum(pc)) 

dfFOCUS_FAM <- dfFOCUS_FAM[(dfFOCUS_FAM$pc>=80 | dfFOCUS_FAM$pcCUM<=80),] 

Der letzte data.table Filter hinzugefügt wurde Reihen von Interesse auszuwählen. Große Reihe (entspricht> = 80% der Summe) und/oder Reihen, die bis 80% der Summe erreichen (Auswahl von Reihen, bis 80% der Summe erreicht werden (zB Filter (pcCUM < = 80)) Auswahl keine Linien, wenn man Zeilen mehr als 80% der Summe repräsentieren)

DPLYR Felsen und data.table zu

wenn man den ersten Teil in data.table Sprache übersetzen könnte ...

Verwandte Themen