使用多个条件子集数据框

时间:2014-02-14 04:04:30

标签: r dataframe subset

假设我的数据框ARAP包含名为CoCdVendorNo的列。 我希望将其组合成另一个名为EMIU_EMIJ的数据框,并将其组合为:

CoCd="EMIJ" & VendorNo = "100010" or
CoCd="EMIU" & VendorNo = "2000001" or
CoCd="EMIU" & VendorNo = "2000006".

我如何结合&和|选择满足两种组合的线? 即它需要将CoCdVendorNo组合配对在一起。

我试过

EMIU_EMIJ<-subset(ARAP,CoCd=="EMIJ"&VendorNo=="100010"|
CoCd=="EMIU"&VendorNo=="2000001"|
CoCd=="EMIU"&VendorNo=="2000006")

我也尝试过括号

EMIU_EMIJ<-subset(ARAP, (CoCd=="EMIJ"&VendorNo=="100010")|(CoCd=="EMIU"&VendorNo=="2000001")|(CoCd=="EMIU"&VendorNo=="2000006"))

但这造成了一个错误:"Error: unexpected symbol in:"EMIU_EMIJ"

如何为上述3种组合中的1种进行子集化?

1 个答案:

答案 0 :(得分:1)

使用merge选项的简单all.y即可。

例如,如果mydf是您的数据

set.seed(111)
mydf <- data.frame(id=rep(LETTERS, each=4)[1:100], replicate(3, sample(1001, 100)),Class=sample(c("Yes", "No"), 100, TRUE))
mydf$CoCd <- paste0("EMI",mydf$id)
mydf$VendorNo <- paste0(mydf$X1,mydf$X2)
mydf <- unique(mydf[,c("CoCd","VendorNo","Class","X3")])

看起来像这样

    CoCd VendorNo Class   X3
1   EMIA   594577   Yes  727
2   EMIA   727137   Yes  921
3   EMIA   371939   Yes  123
4   EMIA   514176    No  950
5   EMIB   377818   Yes  668
6   EMIB    41713    No   85
7   EMIB    11637    No  579
8   EMIB   530266    No  212
9   EMIC   430566   Yes  241
10  EMIC    93958    No  533
11  EMIC   551197   Yes  176
12  EMIC   585686    No  565
13  EMID    67827   Yes  154
14  EMID    47894    No  469
15  EMID   155952    No  718
16  EMID   441649    No  835
17  EMIE   169541   Yes  945
18  EMIE   952871   Yes  452
19  EMIE   306441    No  358
20  EMIE   604730    No  920
21  EMIF   423407    No  868
22  EMIF   280668   Yes  658
23  EMIF   335907   Yes  830
24  EMIF   379620   Yes  841
25  EMIG   946644    No  471

你想要组合

combination_to_select<-data.frame(CoCd=c("EMIA","EMID","EMIF"),VendorNo=c('594577','47894','423407'),stringsAsFactors=FALSE)
combination_to_select

  CoCd VendorNo
1 EMIA   594577
2 EMID    47894
3 EMIF   423407

以下代码为您提供了子集

subset <- merge(mydf,combination_to_select,by=c("CoCd","VendorNo"),all.y=TRUE)
  CoCd VendorNo Class  X3
1 EMIA   594577   Yes 727
2 EMID    47894    No 469
3 EMIF   423407    No 868