dplyr:仅当满足不同列中的多个条件时才进行筛选

dplyr:仅当满足不同列中的多个条件时才进行筛选,r,dplyr,filtering,R,Dplyr,Filtering,这是我的df=myproject myproject <- data.frame( Participant = 1:5, `futuremw:1` = c(1L, 2L, 1L, 1L, NA), `pastmw:1` = c(1L, 1L, 2L, 1L, NA), `proportionfuturepast:1` = c(4L, 7L, 1L, 2L, NA), my_vi

这是我的df=myproject

myproject <- data.frame(
  Participant                = 1:5,
  `futuremw:1`               = c(1L, 2L, 1L, 1L, NA),
  `pastmw:1`                 = c(1L, 1L, 2L, 1L, NA),
  `proportionfuturepast:1`   = c(4L, 7L, 1L, 2L, NA),
  my_video_item_duration_min = c(5, 1, 7.02, 6, 6),
  check.names = FALSE
)
myproject%
过滤器(我的视频项目持续时间>5)%
过滤器(我的视频项目持续时间分钟<7)
现在,每当futuremw:1与2不同,pastmw:1等于1,以及ProportionalFuturePast与3不同时,我都要排除参与者4,因为同时满足所有三个排除标准。如果仅满足一个或两个排除标准,但不满足另一个排除标准,则不排除参与者。 此外,我还想保留参与者n。5,即使它呈现NA值

我试过这个

myproject_filtered = myproject %>%
filter(my_video_item_duration_min > 5) %>%
filter(my_video_item_duration_min < 7) %>%
filter(futuremw_1 != 2 | pastmw_1 == 1 | proportionfuturepast_1 != 3) 
myproject\u filtered=myproject%>%
过滤器(我的视频项目持续时间>5)%
过滤器(我的视频项目持续时间<7)%
过滤器(未来Mw_1!=2 |过去Mw_1==1 |比例未来过去1!=3)
我已经使用了答案中提出的代码,它是有效的。但是,我现在想结合不同的排除标准。以下代码不起作用:

    myproject_excluding_participants = myproject %>%
  filter (
    my_video_item_duration_min >= 5,
    my_video_item_duration_min <= 7,
    ! complete.cases(.) | mind_wandering_1 != 1 | proportionMW_1 != 11,
    ! complete.cases(.) | mind_wandering_1 != 2 | proportionMW_1 == 11,
    ! complete.cases(.) | futuremw_1 != 2 | pastmw_1 != 2 | proportionfuturepast_1 == 4,
    ! complete.cases(.) | futuremw_1 != 1 | pastmw_1 != 2 | proportionfuturepast_1 == 1,
    ! complete.cases(.) | futuremw_1 != 2 | pastmw_1 != 1 | proportionfuturepast_1 == 7,
    ! complete.cases(.) | futuremw_1 != 1 | pastmw_1 != 1 | proportionfuturepast_1 != 1,
    ! complete.cases(.) | futuremw_1 != 1 | pastmw_1 != 1 | proportionfuturepast_1 != 7,
    ! complete.cases(.) | ED_1 != 1 | proportionED_1 != 11
    ! complete.cases(.) | ED_1 != 2 | proportionED_1 != 11,
    ! complete.cases(.) | proportionfuturepast_dailylife_1 != 1 | futureMW_dailylife_1 != 5,
    ! complete.cases(.) | proportionfuturepast_dailylife_1 != 1 | pastMW_dailylife_1 == 5,
    ! complete.cases(.) | proportionfuturepast_dailylife_1 != 7 | pastMW_dailylife_1 != 5,
    ! complete.cases(.) | proportionfuturepast_dailylife_1 != 7 | futureMW_dailylife_1 == 5,
    ! complete.cases(.) | futureMW_dailylife_1 != 5 | pastMW_dailylife_1 != 5 | proportionfuturepast_dailylife_1 == 4,
    ! complete.cases(.) | CurrentConcernsAreas_14 != 1 | SumCurrentConcernsAreas1to13 < 0
    )
myproject\u不包括参与者=myproject%>%
滤器(
我的视频项目持续时间分钟>=5,

my_video_item_duration_min将您的逻辑颠倒过来,定义要保留的内容,反之亦然,要排除的内容:

库(dplyr)
myproject%>%
滤器(
我的视频项目持续时间分钟>=5,
我的视频项目持续时间分钟<7,
!complete.cases(.)| `未来Mw:1`==2 | `过去Mw:1`!=1 | `比例未来过去:1`==3
)
您的数据:

myproject <- data.frame(
  Participant                = 1:5,
  `futuremw:1`               = c(1L, 2L, 1L, 1L, NA),
  `pastmw:1`                 = c(1L, 1L, 2L, 1L, NA),
  `proportionfuturepast:1`   = c(4L, 7L, 1L, 2L, NA),
  my_video_item_duration_min = c(5, 1, 7.02, 6, 6),
  check.names = FALSE
)

myproject
futuremw:1
不是一个合法的变量名:冒号表示这是一个序列。您的意思是
`futuremw:1`
(请注意额外的背景标记)?请插入数据本身的样本,而不是数据的图像,以使此问题更具可复制性。为了便于使用,有许多方法可供选择。(此外,您的图像包含变量名称
`pastmw:1`
,但您的代码显示
pastmw\u 1==3
,请在您拥有的内容和使用的代码上保持一致。)因此,您的预期结果数据集为空?即“持续时间”筛选器保留4-5。参与者5可能会离开,因为您没有说明如何处理
NA
。而4则因您的其他规则而被排除在外。并非所有。参与者1不应被排除在外,因为他的持续时间筛选器为5,而不是例如4.9。参与者5不应被排除在外,因为NA我想包括那些呈现NA的人。您可以告诉我们e
>5
,不包括参与者1。也许值得解释:
x | y | z
可能计算为NA,在这种情况下,
filter
将其视为FALSE,例如
mtcars%%>%slice(1:3)%%>%filter(c(TRUE,FALSE,NA))
它不起作用,因为没有参与者被包括在内。这是输出:[1]参与者未来MW:1过去MW:1[4]比例未来过去:1我的视频项目持续时间\u分钟(或0行长。名称)
library(dplyr)
myproject %>%
  filter(
    my_video_item_duration_min >= 5,
    my_video_item_duration_min < 7,
    ! complete.cases(.) | `futuremw:1` == 2 | `pastmw:1` != 1 | `proportionfuturepast:1` == 3
  )
myproject <- data.frame(
  Participant                = 1:5,
  `futuremw:1`               = c(1L, 2L, 1L, 1L, NA),
  `pastmw:1`                 = c(1L, 1L, 2L, 1L, NA),
  `proportionfuturepast:1`   = c(4L, 7L, 1L, 2L, NA),
  my_video_item_duration_min = c(5, 1, 7.02, 6, 6),
  check.names = FALSE
)