首页 > 解决方案 > 有条件地跨 R 中的多列过滤行

问题描述

我想根据多个条件(不同列中的不同条件)过滤掉行。但无法弄清楚如何。

这是我想要做的。

创建数据库:

library(tidyverse)
set.seed(97531)
pri <- rnorm(n=20, mean = 100, sd = 5)
mkt <- rep(c("Chi","Dhk","Khl","Rjs", "Rng"),each=4)
lvl <- rep(rep(c("Rtl", "Wsl"),each=1),10)
db <- cbind.data.frame(mkt, lvl, pri)

D b

   mkt lvl       pri
1  Chi Rtl 101.79284
2  Chi Wsl  97.33092
3  Chi Rtl  93.36634
4  Chi Wsl 102.22875
5  Dhk Rtl  91.00349
6  Dhk Wsl  96.95135
7  Dhk Rtl 104.16821
8  Dhk Wsl 101.05877
9  Khl Rtl 107.14062
10 Khl Wsl  91.55958
11 Khl Rtl 107.03500
12 Khl Wsl  98.10662
13 Rjs Rtl  96.46905
14 Rjs Wsl 103.93505
15 Rjs Rtl  92.98060
16 Rjs Wsl  97.28547
17 Rng Rtl  96.41526
18 Rng Wsl  96.78083
19 Rng Rtl  99.58515
20 Rng Wsl  95.69551

我想要的是在mkt=="Chi"AND时排除案例lvl=="Wsl"。我尝试了以下代码:

db %>% filter(lvl!="Wsl", mkt!="Chi") 

这将返回以下输出:

  mkt lvl       pri
1 Dhk Rtl  91.00349
2 Dhk Rtl 104.16821
3 Khl Rtl 107.14062
4 Khl Rtl 107.03500
5 Rjs Rtl  96.46905
6 Rjs Rtl  92.98060
7 Rng Rtl  96.41526
8 Rng Rtl  99.58515

期望的输出是:

1   Chi Rtl 101.79284
3   Chi Rtl 93.36634
5   Dhk Rtl 91.00349
6   Dhk Wsl 96.95135
7   Dhk Rtl 104.16821
8   Dhk Wsl 101.05877
9   Khl Rtl 107.14062
10  Khl Wsl 91.55958
11  Khl Rtl 107.035
12  Khl Wsl 98.10662
13  Rjs Rtl 96.46905
14  Rjs Wsl 103.93505
15  Rjs Rtl 92.9806
16  Rjs Wsl 97.28547
17  Rng Rtl 96.41526
18  Rng Wsl 96.78083
19  Rng Rtl 99.58515
20  Rng Wsl 95.69551

标签: rdplyr

解决方案


我们可以否定整个表达式 ( lvl == "Wsl" & mkt == "Chi")with!

library(dplyr)
db %>%
     filter(!(lvl=="Wsl" & mkt == "Chi"))

-输出

#    mkt lvl       pri
#1  Chi Rtl 101.79284
#2  Chi Rtl  93.36634
#3  Dhk Rtl  91.00349
#4  Dhk Wsl  96.95135
#5  Dhk Rtl 104.16821
#6  Dhk Wsl 101.05877
#7  Khl Rtl 107.14062
#8  Khl Wsl  91.55958
#9  Khl Rtl 107.03500
#10 Khl Wsl  98.10662
#11 Rjs Rtl  96.46905
#12 Rjs Wsl 103.93505
#13 Rjs Rtl  92.98060
#14 Rjs Wsl  97.28547
#15 Rng Rtl  96.41526
#16 Rng Wsl  96.78083
#17 Rng Rtl  99.58515
#18 Rng Wsl  95.69551

或者另一种选择是用于|

db %>%
    filter(lvl != "Wsl"| mkt != "Chi")

推荐阅读