【问题标题】:Subset dataframe on presence of certain value in any column [duplicate]任何列中存在特定值的子集数据框[重复]
【发布时间】:2021-02-25 09:02:25
【问题描述】:

我有一个(令人尴尬的)简单问题:如何根据数据框的任何列中的单个值过滤或子集数据框:

df <- data.frame(
  v1 = c(1:10),
  v2 = c(10:1),
  v3 = c(1,3,2,9,5,6,1,2,3,9)
)

假设,我想在任何列中包含值9 的那些行上对df 进行子集化。我可以这样做:

df[df[,1]==9|df[,2]==9|df[,3]==9,]
   v1 v2 v3
2   2  9  3
4   4  7  9
9   9  2  3
10 10  1  9

但是对于这样一个微不足道的任务,一个如此复杂的代码!必须有更有效的方法,在base R或其他包中。

【问题讨论】:

    标签: r filter subset


    【解决方案1】:

    使用rowSums

    subset(df, rowSums(df == 9, na.rm = TRUE) > 0)
    
    #   v1 v2 v3
    #2   2  9  3
    #4   4  7  9
    #9   9  2  3
    #10 10  1  9
    

    【讨论】:

      【解决方案2】:

      其他解决方案:

      df <- data.frame(
        v1 = c(1:10),
        v2 = c(10:1),
        v3 = c(1,3,2,9,5,6,1,2,3,9)
      )
      
      df[apply(df, 1, function(x) any(x == 9)), ]
      #>    v1 v2 v3
      #> 2   2  9  3
      #> 4   4  7  9
      #> 9   9  2  3
      #> 10 10  1  9
      

      reprex package (v1.0.0) 于 2021 年 2 月 25 日创建

      使用 tidyverse

      library(tidyverse)
      df %>% 
        rowwise() %>% 
        filter(any(c_across(everything()) == 9))
      #> # A tibble: 4 x 3
      #> # Rowwise: 
      #>      v1    v2    v3
      #>   <int> <int> <dbl>
      #> 1     2     9     3
      #> 2     4     7     9
      #> 3     9     2     3
      #> 4    10     1     9
      

      reprex package (v1.0.0) 于 2021 年 2 月 25 日创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-16
        • 2016-11-24
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 2016-06-01
        相关资源
        最近更新 更多