我有一个包含多个参与者的数据框,这些参与者执行了6次任务。例如。数据看起来像这样:
subject blockN
1 133 1
17 133 2
33 133 3
49 133 4
65 133 5
81 133 6
97 134 1
113 134 2
129 134 3
145 134 4
161 134 5
177 134 6
193 135 1
209 135 2
225 135 3
241 135 4
257 135 5
273 135 6
289 136 1
305 136 2
此外,我还有一个参与者名单,我需要排除这些名单对(排除名单):
[1] 133 5
[[2]]
[1] 135 1
[[3]]
[1] 135 1
[[4]]
[1] 140 1
现在,我尝试根据这些值对数据框进行子集化。我想避免循环,所以我尝试用sapply解决:df[df$subject %in% sapply(excludeTrials, "[[", 1) & df$blockN %in% sapply(excludeTrials, "[[", 2) ]
和
subset(df, !( (df$subject %in% sapply(excludeTrials, "[[", 1)) & (df$blockN %in% sapply(excludeTrials, "[[", 2)) ) )
问题是,在此行中,它忽略了以下两个事实:两个值都必须在同一行中,并且逻辑运算符针对所有块(1-6)给出TRUE
,因为任何参与者都位于该行的第一个元素中列表。
是否有可能无循环解决?
将excludeTrials
转换为两列数据帧,然后使用subset
。
mat <- do.call(rbind, excludeTrials)
subset(df, !(subject %in% mat[, 1] & blockN %in% mat[, 2]))