2016-10-26 5 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'とラベル付けされたものはなぜ' sub'と 'block'の中で重複していますか? – aichao

答えて

0

あなたはsubblockによる観測をグループ化dplyrを使用してこれを行うことができます。

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

私たちは、新しい列dupnewtrialを作成するためにmutateを使用しています。

データ:sub=1, block=3sub=2, block=3の重複itemを紹介して少しあなたのデータを変更する:

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"] 
関連する問題