按单列和多因素过滤数据集

时间:2018-09-18 09:54:47

标签: r filter dplyr

这可能是一个简单的问题,但即使经过很长一段时间的问答环节并阅读了我能找到的所有备忘单,我也找不到解决方案。

假设我有以下数据集

participant <- c(1, 1, 2, 2, 3,3 ,4,4)
trial <- c(1, 2, 2, 3, 4, 2, 3, 4) 
page <- c(1, 2, 2, 5, 6, 2, 1, 2) 
test <- data.frame(participant, trial, page)

我想从数据集中删除针对特定参与者的特定试验和/或试验中的页面。

因此,例如,假设我只想从参与者1的数据集“试验2”和“第2页”中删除。

我尝试过此方法,但它完全删除了参与者

test <- dplyr::filter(test, participant != "1" & trial != "2" & page != "2")

如何仅删除与另一个值相关的值? 谢谢!

1 个答案:

答案 0 :(得分:1)

dplyr::filter仅保留提供的条件为真的行。您的想法是正确的,执行此操作的一种简单方法是做出一个与要删除的行匹配的条件语句,然后将其反转以选择其他行。问题是将==转换为!=与AND运算符&

交互的方式

您给出条件participant != "1" & trial != "2" & page != "2"仅在以下所有条件都为真时才成立(因为您使用了&):

  • 参与者不是1
  • 审判不是2
  • 页面不是2

因此,如果某行不满足任何这些条件(例如,每行participant == 1),它将被删除


因为您要做的是创建一个与要删除的行匹配的条件语句,然后通过在括号中的整个语句周围使用NOT运算符!来将其求反:

dplyr::filter(test, !(participant == 1 & trial == 2 & page == 2))

  participant trial page
1           1     1    1
2           2     2    2
3           2     3    5
4           3     4    6
5           3     2    2
6           4     3    1
7           4     4    2