如何识别数据子集中的重复项目

时间:2016-10-26 17:01:08

标签: r duplicates

我正在尝试确定在长形式数据集中哪些试验重复但仅在每个参与者的某些块内。我的数据结构如下:

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))

我无法弄清楚的是如何将功能约束到每个主题,并且只限制每个主题编号中的某些块。

谢谢!

2 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:0)

您可以使用dplyrsubblock对观察结果进行分组来实现此目的:

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=3引入重复的sub=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