2016-10-26 53 views
0

我試圖確定在長表單數據集內重複哪些試驗,但只限於每個參與者的某些塊內。我的數據結構是這樣的:如何識別數據子集中的重複項目

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 

我想創建一個新列表示每個參與者,該項目是重複的,並與新的審判代碼中的另一個新列,但前提是項目重複塊2和3。因此,這將是這個樣子:

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 

我已經能夠確定在整個數據集重複使用和添加以下代碼100至各試驗序號:

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

data<-transform(data, 
item=make.unique(as.character(item)), 
newtrial=ifelse(duplicated(item),trial+100, trial)) 

我無法弄清楚的是如何限制每個主題的功能,以及每個主題編號中的特定塊。

謝謝!

+1

您所需的輸出看起來不符合您的輸入。爲什麼那些標記爲'dup = TRUE'的標記在其「子」和「塊」中是重複的? – aichao

回答

0

您可以通過subblock做到這一點使用dplyr分組觀察:

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

我們用mutate創建新列dupnewtrial

數據:修改您的數據略有引進重複itemsub=1, block=3sub=2, block=3

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 

使用此數據:

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

另一種選擇使用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"]