2016-05-13 9 views
0

Ich bin ziemlich neu in R und Datenverarbeitung im Allgemeinen, also bitte verzeihen Sie mir, wenn meine Terminologie ist schlecht.Filter Daten pro Wert der unabhängigen Variablen in R

Ich habe einige Daten mit einer diskreten, nicht eindeutigen unabhängigen Variable DeltaT und einem abhängigen Werten namens Score.

Ich möchte nur die oberen 5 Perzentil (entfernen Sie alles LT 0,95 Perzentil) der Scores für jeden Wert in DeltaT.

Die folgende Abbildung zeigt, was ich zu erreichen versuche.

Example in Excel

Ich habe den Eindruck, es gibt Möglichkeiten, dies ohne Schleifen zu tun, aber nicht wissen, die Namen der Funktionen kann ich brauche.

+0

Können Sie die Daten mit 'dput' Ihres R-Datenrahmenobjekts veröffentlichen? Schwer Daten aus einem Bild zu importieren. – Gopala

Antwort

1

Hier ist eine Basis R-Lösung mit quantile(), ave(), Vergleichs- und Indizierung Unter der Annahme:

df <- data.frame(DeltaT=c(1L,1L,1L,2L,2L,3L,3L,3L,3L,4L,4L,4L),Score=1:12); 
df[df$Score>=ave(df$Score,df$DeltaT,FUN=function(x) quantile(x,0.95)),]; 
## DeltaT Score 
## 3  1  3 
## 5  2  5 
## 9  3  9 
## 12  4 12 

Ihre Beispieldaten nicht ideal ist, weil es deckt nicht den Fall von mehreren Werten ab, die die Filterbedingung erfüllen. Ich habe meine Lösung unter der Annahme geschrieben, dass Sie alle Zeilen behalten möchten, die die Bedingung erfüllen. Hier ist ein besserer Test:

df <- data.frame(DeltaT=c(1L,1L,1L,2L,2L,3L,3L,3L,3L,4L,4L,4L,4L),Score=c(1:12,12)); 
df[df$Score>=ave(df$Score,df$DeltaT,FUN=function(x) quantile(x,0.95)),]; 
## DeltaT Score 
## 3  1  3 
## 5  2  5 
## 9  3  9 
## 12  4 12 
## 13  4 12 
+1

Sowohl diese Antwort als auch die Antwort von @Gopala funktionieren. Diese Lösung wird bevorzugt, da sie mein Problem mit nur nativen Datentypen und Funktionen löst. Vielen Dank! –

1

Ohne Ihre Daten zu haben, habe ich meine eigene erstellt. Hier ist ein Ansatz, den Ihnen mit der Lösung unter Verwendung einer Quantilsfunktion können helfen, den 95. Perzentil Wert zu erhalten und mit dplyr Paket der Gruppierung und Filterfunktionen:

library(dplyr) 
df <- data.frame(DeltaT = c(rep(1, 10), rep(2, 10)), Score = c(1:10, 1:10)) 
df %>% group_by(DeltaT) %>% filter(Score >= quantile(Score, probs = 0.95)) 

Ausgabe in diesem Fall werden, da nur diese beiden Werte des Match 95. Perzentil oder höher:

Source: local data frame [2 x 2] 
Groups: DeltaT [2] 

    DeltaT Score 
    <dbl> <int> 
1  1 10 
2  2 10 

Sie können den Code ändern, der Ihren spezifischen Anforderungen entspricht.

0

Try this:

library(data.table) 


setDT(df) # convert your dataset into a data.table 


output <- df[ score > quantile(df$score, c(.95)), # filter condition 
       .(score=score),      # output column 
       by=.(DeltaT) ]      # grouped by 
0

dplyr sehr hilfreich sein kann. "DF2" ist Ihr data.frame

> library(dplyr) 
> group_by(df2, DeltaT) %>% summarise(Score = round(quantile(Score, probs=0.95),0)) 
Source: local data frame [4 x 2] 

    DeltaT Score 
    (dbl) (dbl) 
1  1  3 
2  2  5 
3  3  9 
4  4 12 
+0

Dies gibt Ihnen die 95. Perzentil-Score. Nicht Zeilen mit dieser Punktzahl oder höher. Siehe meine Antwort unten. – Gopala

+0

Ja, Sie haben Recht. Es braucht Filter dann – sachinv

+0

Richtig, aber warum posten Sie eine andere Antwort, die die gleiche Lösung wie eine unten ist. – Gopala

Verwandte Themen