R中的子集数据帧以成对列表中的两个值为条件

问题描述 投票:0回答:1

我有一个包含多个参与者的数据框,这些参与者执行了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,因为任何参与者都位于该行的第一个元素中列表。

是否有可能无循环解决?

r dataframe subset
1个回答
0
投票

excludeTrials转换为两列数据帧,然后使用subset

mat <- do.call(rbind, excludeTrials)
subset(df, !(subject %in% mat[, 1] & blockN %in% mat[, 2]))
© www.soinside.com 2019 - 2024. All rights reserved.