2016-06-08 24 views
1

Ich habe eine große Datenmenge, die ich entfernen möchte alle Zeilen mit Ausnahme der ersten 8 pro Wert von 1 Variable. (In diesem Beispiel nur die erste)Entfernen Sie alles außer den ersten Zeilen aus einer Teilmenge R

Beispielsatz:

Time <- c(1:20) 
    stimulus <- c(rep("happy 1",4),rep("happy 2",4),rep("disgust 1",4),rep("anger 1",4),rep("sad 1",4)) 
    Happy <- c(runif(20,0,1)) 
    Disgust <- c(runif(20,0,1)) 
    Anger <- c(runif(20,0,1)) 
    Subj1<- data.frame(Time,stimulus,Happy,Disgust,Anger) 

SO: Ich möchte alle Zeilen entfernen, mit Ausnahme Subj1 $ Stimulus 1. Reihe von "glücklich 1", "glücklich 2", " Ekel 1" usw. schaffe ich so durch subsetting auf eine neue Variable zu tun und dann alles, aber die ersten 8 Zeilen Abwahl mit dem folgenden Code:

Stim1<-which(Subj1$stimulus=="happy 1") 
Subj1<- Subj1[-c(Stim1[2:length(Stim1)]),] 

Allerdings möchte ich dies für alle automatisch ausgeführt Stimulusvariablen. Eine andere Sache, die dies erschwert, ist, dass die Zeilennummern wegen des Entfernens von Zeilen springen.

Vielen Dank für Ihre Hilfe!

+0

Sie sagen, Sie möchten alle Zeilen "außer den ersten 8 ..." entfernen, aber Ihr Beispiel entfernt alle bis auf die erste. Was meinen Sie? – Zelazny7

+0

Oder: http://stackoverflow.com/questions/13279582/select-only-the-first-rows-for-each-unique-value-of-a-column-in-r – Jaap

Antwort

1

Wenn wir die erste Zeile für jeden ‚Stimulus‘ entfernen müssen, ist eine Option mit data.table wäre data.table (setDT(Subj1)), gruppiert nach ‚Stimulus‘ zu konvertieren, entfernen wir die erste Beobachtung mit tail

library(data.table) 
setDT(Subj1)[, tail(.SD,-1), by = stimulus] 

Oder wenn wir nur die erste Beobachtung benötigen, head

setDT(Subj1)[, head(.SD,1), by = stimulus] 
# stimulus Time  Happy  Disgust  Anger 
#1: happy 1 1 0.2721827 0.263906233 0.3218399 
#2: happy 2 5 0.6649942 0.006288805 0.4758943 
#3: disgust 1 9 0.4102272 0.275845885 0.6631558 
#4: anger 1 13 0.2924157 0.776806617 0.8609168 
#5:  sad 1 17 0.1599896 0.010758160 0.6081846 

Oder anot verwenden Ihre Option ist unique von data.table mit der by Option.

unique(setDT(Subj1), by = "stimulus") 
# Time stimulus  Happy  Disgust  Anger 
#1: 1 happy 1 0.2721827 0.263906233 0.3218399 
#2: 5 happy 2 0.6649942 0.006288805 0.4758943 
#3: 9 disgust 1 0.4102272 0.275845885 0.6631558 
#4: 13 anger 1 0.2924157 0.776806617 0.8609168 
#5: 17  sad 1 0.1599896 0.010758160 0.6081846 

A dplyr Option 'Stimulus' zu einer Gruppe sein würde und die erste Beobachtung mit slice bekommen.

library(dplyr) 
Subj1 %>% 
    group_by(stimulus) %>% 
    slice(1) 

Oder nutzen ave von base R

Subj1[with(Subj1, ave(seq_along(stimulus), stimulus, FUN = seq_along)==1),] 
+0

Ich mag die dplyr Option, aber fragt OP nicht nach den ersten 8 Reihen? Also, Scheibe (8)? – BarkleyBG

+0

Ja, aber für das Beispiel war es 1 –

+0

@ J.Jansen Was ist los mit meinen Lösungen? Ich habe es zuerst gepostet und habe auch Basis-R-Optionen. – akrun

1

können Sie die Funktion Basis R verwenden duplicated die erste Instanz von einem Stimulus-Niveau zu halten:

newdf <- Subj1[!duplicated(Subj1$stimulus), ] 

Ich musste Stellen Sie sicher, dass der Stimulus kein Faktor ist, indem Sie stringsAsFactors = F verwenden ALSE

Daten

Subj1<- data.frame(Time,stimulus,Happy,Disgust,Anger, stringsAsFactors = FALSE) 

Wenn Ihr data.frame durch Anregung bestellt, und Sie wollen die ersten m Beobachtungen von jedem zu halten, Sie which mit duplicated verwenden könnte wie folgt:

# get rows to include 
myRows <- c(sapply(which(duplicated(Subj1$stimulus)), function(i) i:(i+2))) 
# subset 
newdf <- Subj1[myRows, ] 

Der obige Code wählt die ersten drei Beobachtungen jedes Stimuluslevels aus. Beachten Sie als einen Nachteil, dass nicht überprüft wird, ob in einer Stimulusstufe genügend Beobachtungen vorhanden sind.

Sie können diese Überprüfung jedoch mit table(Subj1$stimulus) durchführen.