2016-10-26 3 views
0

Ich versuche zu identifizieren, welche Versuche innerhalb eines langen Formular-Datensatzes wiederholt werden, aber nur innerhalb bestimmter Blöcke pro Teilnehmer. Meine Daten sind so etwas wie folgt strukturiert:So identifizieren Sie doppelte Elemente in einer Teilmenge von Daten

sub block trial item 
1 1  1  A 
1 1  2  B 
1 2  1  A 
1 2  2  B 
1 3  1  B 
1 3  2  C 
2 1  1  A 
2 1  2  B 
2 2  1  A 
2 2  2  B 
2 3  1  B 
2 3  2  C 

Was würde ich erstellen möchte, ist eine neue Spalte, die für jeden Teilnehmer gibt an, welche Elemente wiederholen und eine weitere neue Spalte mit einem neuen Prozess-Code, aber nur wenn die Einzelteile

data$dup<-duplicated(data$item) 
data$newtrial<-NA 

data<-transform(data, 
item=make.unique(as.character(item)), 
newtrial=ifelse(duplicated(item),trial+100, trial)) 
: in Blöcken wiederholt 2 und 3. So wäre es etwa so aussehen: mit dem folgenden Code

sub block trial item dup  newtrial 
1 1  1  A  FALSE 1 
1 1  2  B  FALSE 2 
1 2  1  A  FALSE 1 
1 2  2  B  FALSE 2 
1 3  1  C  FALSE 1 
1 3  2  B  TRUE  102 
2 1  1  A  FALSE 1 
2 1  2  B  FALSE 2 
2 2  1  A  FALSE 1 
2 2  2  B  FALSE 2 
2 3  1  C  FALSE 1 
2 3  2  B  TRUE  102 

ich in der Lage gewesen, Duplikate über den gesamten Datensatz zu identifizieren und 100 zu jedem Versuch Nummer hinzufügen

Was ich nicht herausfinden konnte, ist, wie man die Funktion auf jedes einzelne Subjekt und nur bestimmte Blöcke innerhalb jeder Subjektnummer beschränkt.

Danke!

+1

Ihre gewünschte Ausgabe scheint nicht mit Ihrer Eingabe übereinzustimmen. Warum werden diese als "dup = TRUE" -Duplikate innerhalb ihres "sub" und "block" bezeichnet? – aichao

Antwort

0

Sie können sub und block dies mit dplyr Gruppierung der Beobachtungen machen:

library(dplyr) 
res <- data %>% group_by(sub,block) %>% 
       mutate(dup=duplicated(item)) %>% 
       ungroup %>% 
       mutate(newtrial=ifelse(dup,trial+100,trial)) 

Wir verwenden mutate neue Spalten dup und newtrial zu erstellen.

Daten: Ihre Daten ändern leicht doppelte item für sub=1, block=3 und sub=2, block=3 vorstellen:

data <- structure(list(sub = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L), block = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 3L, 
3L), trial = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L 
), item = structure(c(1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 
2L, 2L), .Label = c("A", "B"), class = "factor")), .Names = c("sub", 
"block", "trial", "item"), class = "data.frame", row.names = c(NA, 
-12L)) 
## sub block trial item 
##1 1  1  1 A 
##2 1  1  2 B 
##3 1  2  1 A 
##4 1  2  2 B 
##5 1  3  1 B 
##6 1  3  2 B 
##7 2  1  1 A 
##8 2  1  2 B 
##9 2  2  1 A 
##10 2  2  2 B 
##11 2  3  1 B 
##12 2  3  2 B 

Mit Hilfe dieser Daten:

print(res) 
### A tibble: 12 x 6 
##  sub block trial item dup newtrial 
## <int> <int> <int> <fctr> <lgl> <dbl> 
##1  1  1  1  A FALSE  1 
##2  1  1  2  B FALSE  2 
##3  1  2  1  A FALSE  1 
##4  1  2  2  B FALSE  2 
##5  1  3  1  B FALSE  1 
##6  1  3  2  B TRUE  102 
##7  2  1  1  A FALSE  1 
##8  2  1  2  B FALSE  2 
##9  2  2  1  A FALSE  1 
##10  2  2  2  B FALSE  2 
##11  2  3  1  B FALSE  1 
##12  2  3  2  B TRUE  102 
1

eine andere Option data.table:

library(data.table) 
xt <- fread("sub block trial item 
1 1  1  A 
1 1  2  B 
1 2  1  A 
1 2  2  B 
1 3  1  B 
1 3  2  B 
2 1  1  A 
2 1  2  B 
2 2  1  A 
2 2  2  B 
2 3  1  B 
2 3  2  B") 

xt[, 
    c("dup","ntrial") := { 
    dup <- duplicated(item) 
    tt <- ifelse(dup,trial+100L,trial) 
    list(dup,tt) 
    },"sub,block"] 
Verwandte Themen