Back

Explore Courses Blog Tutorials Interview Questions
0 votes
3 views
in R Programming by (5.3k points)

I have data similar to this:

dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))

I want to select rows from this data frame based on the values in the fct variable. For example, if I wish to select rows containing either "a" or "c" I can do this:

dt[dt$fct == 'a' | dt$fct == 'c', ]

which yields

1    a 2

3    c 3

5    c 5

7    a 7

9    c 9

10   a 1

12   c 2

14   c 4

as expected. But my actual data is more complex and I actually want to select rows based on the values in a vector such as

vc <- c('a', 'c')

So I tried

dt[dt$fct == vc, ]

but of course, that doesn't work. I know I could code something to loop through the vector and pull out the rows needed and append them to a new data frame, but I was hoping there was a more elegant way.

So how can I filter/subset my data based on the contents of the vector vc?

1 Answer

0 votes
by
edited

You can use the %in% operator as follows:

dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), 

                                     .Label = c("a", "b", "c", "d"), class = "factor"), 

                     X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)),

                .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))

vc <- c('a', 'c')

dt[dt$fct %in% vc,]

> dt[dt$fct %in% vc,]

   fct X

1    a 2

3    c 3

5    c 5

7    a 7

9    c 9

10   a 1

12   c 2

14   c 4

You can also use the following:

> dt[is.element(dt$fct, vc),]

   fct X

1    a 2

3    c 3

5    c 5

7    a 7

9    c 9

10   a 1

12   c 2

14   c 4

If you want to learn more about R programming watch this tutorial on Introduction to Data Science with R 

Browse Categories

...