2016-04-25 6 views
0

Ich habe versucht, eine Möglichkeit zu finden, dies durch R zu schreiben, aber kann es einfach nicht bekommen. Ich habe einen Datensatz wie folgt aus:Wählen Sie bestimmte Zeilen basierend auf vorherigen Zeile Wert (in der gleichen Spalte)

Trial Type Correct Latency  
1  55 0  0 
3  30 1  766 
4  10 1  344 
6  40 1  716 
7  10 1  326 
9  30 1  550 
10  10 1  350 
11  64 0  0 
13  30 1  683 
14  10 1  270 
16  30 1  666 
17  10 1  297 
19  40 1  616 
20  10 1  315 
21  64 0  0 
23  40 1  850 
24  10 1  322 
26  30 1  566 
27  20 0  766 
28  40 1  500 
29  20 1  230 

, die viel länger geht (um 1000 Zeilen).

Von diesem einen Datensatz, würde ich gerne 4 separate data.frames erstellen/Tabellen Ich kann Tabellen exportieren mit als auch tun, um meine eigene Berechnungen

Ich möchte einen data.frame (insgesamt 4 haben), ein für jedes dieser Aufzählungspunkte:

  • Typ 10 Zeilen, die von einem Typ 30 Zeile
  • Typ 10 Zeilen vorausgehen, die von einem Typ 40 Zeile
  • Typ 20 Zeilen vorausgehen, die vorangeht durch eine Reihe vom Typ 30
  • Typ 20 Zeilen, die von einer Art 40 Reihe voraus sind

ich für alle Spalten in den entsprechenden Zeilen in diese neuen Tabellen platziert werden möchte, aber die Spalte Informationen von Zeilentypen 10 oder 20 nur mit . die erste Tabelle

beispielsweise (Typen von Typ 30 voran 10) würde diese auf den Probendaten basierend mag:

Trial Type Correct Latency  
    4  10  1  344 
    10  10  1  350 
    14  10  1  270 
    17  10  1  297 

zweite Tabelle (Typ 10 nach Art voran 40):

Trial Type Correct Latency  
    7  10  1  326 
    20  10  1  315 
    24  10  1  322 

dritte Tabelle (Typ nach Art voran 20 30):

Trial Type Correct Latency  
    27  20  0  766 

vierte Tabelle (Tabelle nach Art voran 20 40):

Trial Type Correct Latency   
29  20  1  230 

Ich kann nur eine Teilmenge von 10 Zeilen und eine andere für 20 Zeilen, aber ich kann nicht finde heraus, wie man verschiedene Tabellen für die Zeilen vom Typ 10 und 20 basierend auf dem vorherigen Typwert erstellt. Ein Problem ist auch, dass "Trials" nicht in Ordnung ist (überspringt Zahlen).

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

Auch, gibt es eine Möglichkeit, die vorherige Zeile als auch enthalten, so dass der Ausgang für die vierte Tabelle würde wie folgt aussehen:

Vierte Tabelle (Tabellen nach Typ voran 20 40):

Trial Type Correct Latency   
28  40  1  500 
29  20  1  230 

Antwort

0

Für das vierte Beispiel: Sie which() in Kombination mit lag() von dplyr, die Indizes verwenden könnte zu erreichen, die Ihren Kriterien entsprechen. Dann können Sie diese verwenden, um die data.frame zu unterteilen.

# Get indices of rows that meet condition 
ind2 <- which(df$Type==20 & dplyr::lag(df$Type)==40) 
# Get indices of rows before the ones that meet condition 
ind1 <- which(df$Type==20 & dplyr::lag(df$Type)==40)-1 

# Subset data 
> df[c(ind1,ind2)] 
    Trial Type Correct Latency 
1: 28 40  1  500 
2: 29 20  1  230 
+0

Hallo mtoto, ich habe den Code ausprobiert, aber ich bekomme nur eine leere Tabelle (mit nur den Spaltenüberschriften). Irgendwelche Vorschläge, was ich falsch machen könnte? Vielen Dank. – pdhami

+0

Ich habe das Problem herausgefunden, wir brauchen 'lag()' aus 'dplyr', nicht aus' stats' Paket. Antwort aktualisiert – mtoto

+0

Sie können es auch komplett in 'dplyr' mit' filter (df, Type == 10 & lag (Type) == 30) ' – User7598

0

Hier ist ein Beispiel-Code, wenn Sie immer die ersten Versuche Ihrer Daten löschen möchten.

var1 <- c(1,2,1,2,1,2,1,2,1,2) 
var2 <- c(1,1,1,2,2,2,2,3,3,3) 

dat <- data.frame(var1, var2) 

var1 var2 
1  1 1 
2  2 1 
3  1 1 
4  2 2 
5  1 2 
6  2 2 
7  1 2 
8  2 3 
9  1 3 
10 2 3 

#delete only this line directly 
filter(dat,lag(var2)==var2) 

var1 var2 
1  1 1 
2  2 1 
3  1 1 
6  2 2 
7  1 2 
10 2 3 

#delete the first 2 trials 
#make a list of all rows where var2[n-1]!=var2[n] --> using lag from dplyr 
drops <- c(1,2,which(lag(dat$var2)!=dat$var2), which(lag(dat$var2)!=dat$var2)+1) 
if (!identical(drops,numeric(0))) { dat <- dat[-drops,] } 

var1 var2 
3  1 1 
6  2 2 
7  1 2 
10 2 3