【问题标题】:How to select column values based on a greater than condition in row values如何根据行值中的大于条件选择列值
【发布时间】:2019-07-30 01:36:14
【问题描述】:

如果列中的任何值大于 3,我想从数据框中选择列。

在此 mtcars 示例中,此标准将删除 vsam,因为没有大于 3 的值 在那些列中。

                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2

【问题讨论】:

    标签: r dataframe dplyr lapply


    【解决方案1】:

    我们可以通过将数据框与 3 进行比较来创建一个逻辑向量,然后使用 colSums 对列求和,并仅选择其中至少一个值大于 3 的列。

    mtcars[colSums(mtcars > 3) > 0]
    
    #                     mpg cyl  disp  hp drat    wt  qsec gear carb
    #Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46    4    4
    #Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02    4    4
    #Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61    4    1
    #Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44    3    1
    #....
    

    使用sapply的变化

    mtcars[sapply(mtcars, function(x) any(x > 3))]
    

    【讨论】:

    • 哎呀抱歉,我注意到我拥有的数据是矩阵,如果我应用它它不起作用..但是如果我这样做 dataf
    • @Vlad 在矩阵的情况下,您只需要在子集列中添加一个额外的逗号。例如,mat <- as.matrix(mtcars); mat[,colSums(mat > 3) > 0]
    【解决方案2】:

    purrr:

    mtcars[,purrr::map_lgl(mtcars,~any(.x>3))]
    

    输出(截断):

       #                      mpg cyl  disp  hp drat    wt  qsec gear carb
       # Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46    4    4
       # Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02    4    4
       # Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61    4    1
       # Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44    3    1
       # Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02    3    2
    

    【讨论】:

      【解决方案3】:

      我觉得

      ## find max val for each column
      maxcolval <- apply(mtcars,MARGIN=2,FUN=max)
      ## select columns
      mtcars[maxcolval>3]
      

      做你想做的事。如果你想要一个 tidyverse 解决方案(因为标签中有dplyr),

      library(dplyr) 
      mtcars %>% select_if(~max(.)>3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 2022-11-22
        • 2015-11-04
        • 2019-08-13
        • 1970-01-01
        相关资源
        最近更新 更多