1

I have the following matrix (actually a data frame) in R:

> str(x2)
'data.frame':   274569 obs. of  15 variables:
 $ ykod : int  99 99 99 99 99 99 99 99 99 99 ...
 $ yad  : Factor w/ 43 levels "BAKUGAN","BARBIE",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ per  : Factor w/ 3 levels "2 AYLIK","3 AYLIK",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ donem: int  201106 201106 201106 201106 201106 201106 201106 201106 201106 201106 ...
 $ sayi : int  201106 201106 201106 201106 201106 201106 201106 201106 201106 201106 ...
 $ mkod : int  359 361 362 363 366 847 849 850 1505 1506 ...
 $ mad  : Factor w/ 11045 levels "    Hilal Gida           ",..: 5163 3833 10840 8284 10839 2633 10758 10293 6986 6984 ...
 $ mtip : Factor w/ 30 levels "Abone Bürosu                                      ",..: 20 20 20 20 20 2 2 2 11 11 ...
 $ kanal: Factor w/ 2 levels "OB","SS": 2 2 2 2 2 2 2 2 1 1 ...
 $ bkod : int  110006 110006 110006 110006 110006 110006 110006 110006 110006 110006 ...
 $ bad  : Factor w/ 213 levels "4. Levent","500 Evler",..: 25 25 25 25 25 25 25 25 25 25 ...
 $ bolge: Factor w/ 12 levels "Adana Şehiriçi",..: 7 7 7 7 7 7 7 7 7 7 ...
 $ sevk : int  5 2 2 2 10 0 4 3 13 32 ...
 $ iade : int  0 2 1 2 4 0 3 2 0 8 ...
 $ satis: int  5 0 1 0 6 0 1 1 13 24 ...

I'd like to create subsets from this main data frame. For example, I need a sub-matrix having multiple conditions fulfilled, such as ykod = 123 and donem = 201109 and sevk > 20 and satis > 10.

How can I achieve that?

Mehper C. Palavuzlar
  • 10,089
  • 23
  • 56
  • 69

2 Answers2

3
x2[x2$ykod == 123 & x2$donem == 201109 & x2$sevk > 20 & x2$satis > 10,]

or, to make it shorter:

with(x2, x2[ykod == 123 & donem == 201109 & sevk > 20 & satis > 10,])

or, if the columns are attached to global variables (with attach(x2)), you can just write

x2[ykod == 123 & donem == 201109 & sevk > 20 & satis > 10,]

if you want just columns ykod and yad:

x2[x2$ykod == 123 & x2$donem == 201109 & x2$sevk > 20 & x2$satis > 10, c('ykod', 'yad')]

if you want only first 4 columns (I shortened the condition here):

x2[x2$ykod == 123, 1:4]
Tomas
  • 57,621
  • 49
  • 238
  • 373
3

If, like me, you are handier with SQL than R data frames you could use sqldf:

require(sqldf)
x2_subset <- sqldf( 
    "SELECT * FROM x2
     WHERE ykod = 123
      AND donem = 201109
      AND sevk > 20
      AND satis > 10" )

As a bonus it's supposed to be faster with large data frames or complex operations too.

G. Grothendieck
  • 254,981
  • 17
  • 203
  • 341
ROLO
  • 4,183
  • 25
  • 41