【问题标题】:dplyr filter by the first columndplyr 按第一列过滤
【发布时间】:2018-03-05 22:44:23
【问题描述】:

filter 中的dplyr 可以按列的位置吗?

我知道没有dplyr怎么办

iris[iris[,1]>6,]

但是我如何在 dplyr 中做到这一点?

谢谢!

【问题讨论】:

  • 我真的不知道这是不是一个好方法,更不用说最好的方法了,但是iris %>% filter(select(.,1) > 6)也许?
  • iris %>% filter(.[[1]] > 6)

标签: r filter dplyr


【解决方案1】:

没有魔法,只使用上面的项目列号,而不是变量(列)名称:

library("dplyr")

iris %>%
  filter(iris[,1] > 6)

@eipi10 评论的更好

iris %>%
  filter(.[[1]] > 6)

【讨论】:

  • 应该是filter(.[,1] > 6)。这里没关系,但一般来说,如果您在过滤器之前使用其他管道函数更改了初始数据帧,filter(iris[,1] > 6) 将到达管道外部到原始数据帧,而不是使用管道数据帧。
  • 就像这两者不可比的例子 - iris %>% mutate(Sepal.Length=0) %>% filter(iris[,1] > 6) vs iris %>% mutate(Sepal.Length=0) %>% filter(.[,1] > 6)
【解决方案2】:

除了@thelatemail 的建议,您还可以使用filter_at 并将列号传递给vars 参数:

iris %>% filter_at(1, all_vars(. > 6))

all(iris %>% filter_at(1, all_vars(. > 6)) == iris[iris[,1] > 6, ])
# [1] TRUE

【讨论】:

    【解决方案3】:

    dply >= 1.0.0

    作用域动词(_if_at_all)以及扩展名all_vars()any_vars() 已被across() 取代。在 filter 的情况下,已创建函数 if_any and if_all 以跨多个列组合逻辑以帮助子集(这些动词在 dplyr >= 1.0.4 中可用):

    if_any() 和 if_all() 用于将相同的谓词函数应用于选择的列并将结果组合成一个逻辑向量。

    acrossif_anyif_any 的第一个参数仍然是用于列选择的 tidy-select 语法,其中包括按列位置进行选择。

    单列

    在您的 single 列案例中,您可以使用相同的结果执行任何操作:

    iris %>% 
      filter(across(1, ~ . > 6))
    
    iris %>% 
      filter(if_any(1, ~ . > 6))
    
    iris %>% 
      filter(if_all(1, ~ . > 6))
    

    多列

    如果您在多个列中应用谓词函数或公式,那么across 可能会产生意外结果,在这种情况下您应该使用if_anyif_all

    iris %>% 
      filter(if_all(c(2, 4), ~ . > 2.3)) # by column position
    
      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    1          6.3         3.3          6.0         2.5 virginica
    2          7.2         3.6          6.1         2.5 virginica
    3          5.8         2.8          5.1         2.4 virginica
    4          6.3         3.4          5.6         2.4 virginica
    5          6.7         3.1          5.6         2.4 virginica
    6          6.7         3.3          5.7         2.5 virginica
    

    请注意,这将返回 所有 选定列的值大于 2.3 的行,这是其中 任何 选定列符合逻辑的行的子集:

    iris %>% 
      filter(if_any(ends_with("Width"), ~ . > 2.3)) # same columns selection as above
    
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    1           5.1         3.5          1.4         0.2    setosa
    2           4.9         3.0          1.4         0.2    setosa
    3           4.7         3.2          1.3         0.2    setosa
    4           4.6         3.1          1.5         0.2    setosa
    5           5.0         3.6          1.4         0.2    setosa
    6           6.7         3.3          5.7         2.5 virginica
    7           6.7         3.0          5.2         2.3 virginica
    8           6.3         2.5          5.0         1.9 virginica
    9           6.5         3.0          5.2         2.0 virginica
    10          6.2         3.4          5.4         2.3 virginica
    11          5.9         3.0          5.1         1.8 virginica
    

    上面的输出在这个例子中被缩短了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2022-01-02
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      相关资源
      最近更新 更多