【问题标题】:Remove all rows which contain at least one negative value in R删除 R 中至少包含一个负值的所有行
【发布时间】:2020-09-07 21:21:48
【问题描述】:

我不想删除所有负面元素,我可以做到。但是,我想删除所有行,即使它在我的数据框中只包含一个负值。

> head(kosoyCorrected)
       BER1_EW    BER2_EW      BER3_EW    BER4_EW      BER5_EW     BER6_EW
1  7.087613184 7.09928796  7.087194381 6.96315939  7.086734346  7.09934523
2  4.599450934 3.89325300  4.160360141 4.81419817  4.090161726  4.34070903
3  0.100477184 0.02351617 -0.001589346 0.01072809  0.023073244 -0.06953596
4  0.132531627 0.09994992  0.123564389 0.13849246  0.217604484  0.09164854
5 -0.005220038 0.07117798  0.133075865 0.05525490 -0.003944601  0.10597363
6  0.107204375 0.11755171  0.060868101 0.14361525  0.109494893  0.13081894

例如,在这里,我想删除整个第 3 行和第 5 行,而不仅仅是这些行中的 4 个负值。

提前致谢!

【问题讨论】:

    标签: r filtering


    【解决方案1】:

    我们可以使用rowSums 来创建一个逻辑向量来对行进行子集化

    subset(kosoyCorrected, !rowSums(kosoyCorrected < 0))
    #  BER1_EW    BER2_EW   BER3_EW   BER4_EW   BER5_EW    BER6_EW
    #1 7.0876132 7.09928796 7.0871944 6.9631594 7.0867343 7.09934523
    #2 4.5994509 3.89325300 4.1603601 4.8141982 4.0901617 4.34070903
    #4 0.1325316 0.09994992 0.1235644 0.1384925 0.2176045 0.09164854
    #6 0.1072044 0.11755171 0.0608681 0.1436152 0.1094949 0.13081894
    

    或者另一个选项是Reduce

    subset(kosoyCorrected, Reduce(`&`, lapply(kosoyCorrected, `>`, 0)))
    

    或者dplyr 中带有filter_all 的矢量化选项

    library(dplyr)
    kosoyCorrected %>%
           filter_all( all_vars(. > 0))
    #    BER1_EW    BER2_EW   BER3_EW   BER4_EW   BER5_EW    BER6_EW
    #1 7.0876132 7.09928796 7.0871944 6.9631594 7.0867343 7.09934523
    #2 4.5994509 3.89325300 4.1603601 4.8141982 4.0901617 4.34070903
    #4 0.1325316 0.09994992 0.1235644 0.1384925 0.2176045 0.09164854
    #6 0.1072044 0.11755171 0.0608681 0.1436152 0.1094949 0.13081894
    

    或者在较新的版本中使用across

    kosoyCorrected %>% 
            filter(across(everything(), ~ . > 0))
    

    数据

    kosoyCorrected <- structure(list(BER1_EW = c(7.087613184, 4.599450934, 0.100477184, 
    0.132531627, -0.005220038, 0.107204375), BER2_EW = c(7.09928796, 
    3.893253, 0.02351617, 0.09994992, 0.07117798, 0.11755171), BER3_EW = c(7.087194381, 
    4.160360141, -0.001589346, 0.123564389, 0.133075865, 0.060868101
    ), BER4_EW = c(6.96315939, 4.81419817, 0.01072809, 0.13849246, 
    0.0552549, 0.14361525), BER5_EW = c(7.086734346, 4.090161726, 
    0.023073244, 0.217604484, -0.003944601, 0.109494893), BER6_EW = c(7.09934523, 
    4.34070903, -0.06953596, 0.09164854, 0.10597363, 0.13081894)), 
    class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    

    【讨论】:

    • 第一个和第二个解决方案没有给出相同的结果。可能,第二个效果更好,因为我排除了更多行。你可以解释吗?或者,也许修改第一个解决方案?
    • @kikibobo 你有什么 NA 元素
    • 我的 df 中没有任何 NA
    【解决方案2】:

    另一个使用 rowSums + sign 的基本 R 选项

    subset(kosoyCorrected,rowSums(sign(kosoyCorrected))==ncol(kosoyCorrected))
    

    给予

        BER1_EW    BER2_EW   BER3_EW   BER4_EW   BER5_EW    BER6_EW
    1 7.0876132 7.09928796 7.0871944 6.9631594 7.0867343 7.09934523
    2 4.5994509 3.89325300 4.1603601 4.8141982 4.0901617 4.34070903
    4 0.1325316 0.09994992 0.1235644 0.1384925 0.2176045 0.09164854
    6 0.1072044 0.11755171 0.0608681 0.1436152 0.1094949 0.13081894
    

    【讨论】:

    • 我得到了你的解决方案!有了这个,我最终得到了 23723 行。你或@tmfmnk 能解释一下为什么他们的解决方案会导致 24135 行吗?更多的行可能意味着某些行没有被排除
    • @kikibobo 似乎所有解决方案都遵循相同的逻辑。我不知道当你运行他们的真实数据时发生了什么
    • 在命令 'filter(min(c_across(everything())) >= 0)' 中,我假设它对每一行的列求和,如果行总和 >= 0 则过滤。但是可能存在具有负值但总和为正的行,因此不会排除这些行。但我不怎么使用 dplyr,所以我不确定我的结论。如果有人能解决这个问题,那对我来说非常有用。
    【解决方案3】:

    一个dplyr 选项可以是:

    df %>%
     rowwise() %>%
     filter(all(c_across(everything()) >= 0))
    
      BER1_EW BER2_EW BER3_EW BER4_EW BER5_EW BER6_EW
        <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
    1   7.09   7.10    7.09     6.96    7.09   7.10  
    2   4.60   3.89    4.16     4.81    4.09   4.34  
    3   0.133  0.0999  0.124    0.138   0.218  0.0916
    4   0.107  0.118   0.0609   0.144   0.109  0.131 
    

    或者:

    df %>%
     rowwise() %>%
     filter(min(c_across(everything())) >= 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-02
      • 2021-03-06
      • 2021-11-28
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2012-11-07
      相关资源
      最近更新 更多