Subset / filter rows in a data frame based on a condition in a column

298,784

Solution 1

Here are the two main approaches. I prefer this one for its readability:

bar <- subset(foo, location == "there")

Note that you can string together many conditionals with & and | to create complex subsets.

The second is the indexing approach. You can index rows in R with either numeric, or boolean slices. foo$location == "there" returns a vector of T and F values that is the same length as the rows of foo. You can do this to return only rows where the condition returns true.

foo[foo$location == "there", ]

Solution 2

Just to extend the answer above you can also index your columns rather than specifying the column names which can also be useful depending on what you're doing. Given that your location is the first field it would look like this:

    bar <- foo[foo[ ,1] == "there", ]

This is useful because you can perform operations on your column value, like looping over specific columns (and you can do the same by indexing row numbers too).

This is also useful if you need to perform some operation on more than one column because you can then specify a range of columns:

    foo[foo[ ,c(1:N)], ]

Or specific columns, as you would expect.

    foo[foo[ ,c(1,5,9)], ]
Share:
298,784

Related videos on Youtube

wishihadabettername
Author by

wishihadabettername

Updated on July 05, 2022

Comments

  • wishihadabettername
    wishihadabettername almost 2 years

    Given a data frame "foo", how can I select only those rows from "foo" where e.g. foo$location = "there"?

    foo = data.frame(location = c("here", "there", "here", "there", "where"), x = 1:5, y = 6:10)
    foo
    #   location x  y
    # 1     here 1  6
    # 2    there 2  7
    # 3     here 3  8
    # 4    there 4  9
    # 5    where 5 10
    

    Desired result, "bar":

    #   location x y
    # 2    there 2 7
    # 4    there 4 9
    
  • Chetan Arvind Patil
    Chetan Arvind Patil almost 7 years
    .@JoFrhwld - Isn't subset() not preferred method? Detailed discussion here
  • schoon
    schoon over 6 years
    Is there a simple way of accessing both subset and foo minus the subset? I want to split my data into bar and (foo-bar). Obviously, I could repeat the above with !=, but is there a one-liner way?
  • Sumedha Nagpal
    Sumedha Nagpal over 4 years
    Hello I am learning indexing and I have a question. Given that a specific set of columns can be extracted here, for example, foo[foo$location == '"there",5:8] what would happen if i try to assign a value to these like this: foo[foo$location == "there",5:8] <-FALSE
  • A1aks
    A1aks almost 4 years
    very well explained.!