user63230
user63230

Reputation: 4636

dplyr filter vector by position in pipe %>%

From this excellent answer it is possible to filter a vector with dplyr in a pipe using magrittr package underneath like so:

library(dplyr)
c("D", "B", "C", "A", NA) %>% 
  .[matches("[^AB]", vars=.)]
#[1] "D" "C"

c("D", "B", "C", "A", NA) %>% 
  .[.!="A"]
# [1] "D" "B" "C" NA 

But I would like to filter by vector position so if I wanted the first two positions I would get:

#[1] "D" "B"    #want to filter position <= 2

If I wanted 1st and 4th position I would get:

#[1] "D" "A"    #want to filter position by c(1, 4)

etc....

What is the best way to achieve this?

I thought using row_number might work but then remembered this wouldn't work as the sequence isn't right:

row_number(c("D", "B", "C", "A", NA))
# [1]  4  2  3  1 NA

I would be better using seq_along:

seq_along(c("D", "B", "C", "A", NA))
# [1] 1 2 3 4 5

But I'm not sure how to incorporate that in a pipe though.

Any ideas?

Thanks

Upvotes: 1

Views: 1104

Answers (3)

user63230
user63230

Reputation: 4636

Worth adding purrr::keep_at (or purrr::discard_at):

library(purrr)
c("D", "B", "C", "A", NA) %>% 
  keep_at(c(1, 4))
# [1] "D" "A"

Upvotes: 0

loard
loard

Reputation: 113

To filter a vector positionally using a dplyr pipe you could do this:

c("D", "B", "C", "A", NA) %>% .[seq_along(.) %in% c(1,4)]

Upvotes: 3

bcarlsen
bcarlsen

Reputation: 1441

The term "filtering" are not normally used to describe vector operations. Base R has a great tool for vector indexing/extracting: [

There is zero reason to involve the magrittr pipe here. dplyr verbs like filter() have no real world utility for vector operations, they are intended to be used exclusively for manipulating tbl objects.

In your examples you got tidyselect helpers involved, but that is insane overkill for doing basic positional matching.


> my_vector <- c("D", "B", "C", "A", NA)

> my_vector[c(1,2)]
[1] "D" "B"

> my_vector[c(1,4)]
[1] "D" "A"

Upvotes: 1

Related Questions