我正在尝试确定在长形式数据集中哪些试验重复但仅在每个参与者的某些块内。我的数据结构如下:
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))
我无法弄清楚的是如何将功能约束到每个主题,并且只限制每个主题编号中的某些块。
谢谢!
答案 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)
您可以使用dplyr
按sub
和block
对观察结果进行分组来实现此目的:
library(dplyr)
res <- data %>% group_by(sub,block) %>%
mutate(dup=duplicated(item)) %>%
ungroup %>%
mutate(newtrial=ifelse(dup,trial+100,trial))
我们使用mutate
创建新列dup
和newtrial
。
数据:略微修改您的数据,为item
和sub=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