首页 > 解决方案 > dplyr 按管道中的位置过滤向量 %>%

问题描述

从这个出色的答案中,可以使用下面的包在dplyr管道中过滤矢量,如下所示:magrittr

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 

但我想按矢量位置过滤,所以如果我想要前两个位置,我会得到:

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

如果我想要第 1 和第 4 名,我会得到:

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

ETC....

实现这一目标的最佳方法是什么?

我认为 usingrow_number可能有效,但后来想起这行不通,因为顺序不正确:

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

我会更好地使用seq_along

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

但是我不确定如何将其合并到管道中。

有任何想法吗?

谢谢

标签: rvectordplyrmagrittr

解决方案


术语“过滤”通常不用于描述向量操作。Base R 有一个很好的矢量索引/提取工具:[

在这里涉及 magrittr 管道的理由为零。dplyr像这样的动词filter()对向量操作没有现实世界的实用性,它们旨在专门用于操作tbl对象。

在您的示例中,您涉及到 tidyselect 助手,但这对于进行基本的位置匹配来说太疯狂了。


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

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

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


推荐阅读