【问题标题】:Double Negation in RR中的双重否定
【发布时间】:2021-06-15 09:18:43
【问题描述】:

我在 R 中有一个数据框:

df =

yy     mm  data
2012    1  1000
2012    1  1500 
2013    2  1250
2013    1  1350

我想要的是在 yy = 2013 和 mm = 1 时排除列。我试过了

df[(df$yy != 2013) & (df$mm != 1),]

但它不起作用。

【问题讨论】:

  • 如果存在两个条件都没有同时满足的行,它将起作用。在这种情况下它可能返回 0 行

标签: r dataframe slice


【解决方案1】:

将您的代码更改为以下内容:

df[df$yy != 2013 | df$mm != 1,]

输出

#>      yy    mm  data
#>   <dbl> <dbl> <dbl>
#> 1  2012     1  1000
#> 2  2012     1  1500
#> 3  2013     2  1250

您也可以使用dplyr 包中的filter 来完成此操作。

library(tibble)
library(dplyr)

df <- tibble::tribble(
   ~yy, ~mm, ~data,
  2012,    1,  1000,
  2012,    1,  1500,
  2013,    2,  1250,
  2013,    1,  1350
  )

df %>% 
  filter(yy != 2013 | mm != 1)

#> # A tibble: 3 x 3
#>      yy    mm  data
#>   <dbl> <dbl> <dbl>
#> 1  2012     1  1000
#> 2  2012     1  1500
#> 3  2013     2  1250

reprex package (v0.3.0) 于 2021-03-17 创建

【讨论】:

    【解决方案2】:

    这是使用subset 的基本 R 选项

    subset(
      df,
      !(yy == 2013 & mm == 1)
    )
    

    给了

        yy mm data
    1 2012  1 1000
    2 2012  1 1500
    3 2013  2 1250
    

    【讨论】:

      【解决方案3】:

      这些都应该工作:

      df[(df$yy != 2013) | (df$mm != 1),] # note the | not &
      
      df[!((df$yy == 2013) & (df$mm == 1)),]
      

      输出:

      A data.frame: 3 × 3
          yy      mm      data
          <dbl>   <dbl>   <dbl>
      1   2012    1       1000
      2   2012    1       1500
      3   2013    2       1250
      

      【讨论】:

        【解决方案4】:

        使用来自collapsefsubset

        library(collapse)
        fsubset(df, yy != 2013 | mm != 1)
        # A tibble: 3 x 3
        #     yy    mm  data
        #  <dbl> <dbl> <dbl>
        #1  2012     1  1000
        #2  2012     1  1500
        #3  2013     2  1250
        

        【讨论】:

          猜你喜欢
          • 2010-09-19
          • 2015-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多