【问题标题】:Subsetting certain columns while ignoring NA values R子集某些列同时忽略 NA 值 R
【发布时间】:2020-08-02 18:34:31
【问题描述】:

我正在寻找一个数据框,其中 4 列的所有值都低于 0.5,不包括 NA 值。

可重现的例子

set.seed(121)
df = data.frame(ma1=runif(n=100, min=1e-5, max=.9999),
               ma2=runif(n=100, min=1e-5, max=.9999),
               intercept=runif(n=100, min=1e-5, max=.9999),
               a1=runif(n=100, min=1e-5, max=.9999),
               a2=runif(n=100, min=1e-5, max=.9999))


while(sum(is.na(df) == TRUE) < (nrow(df) * ncol(df) * 40/100)){
  df[sample(nrow(df),1), sample(ncol(df),1)] <- NA
}

head(df,5)
#   ma1         ma2         intercept   a1          a2 
1   0.3991884   0.17579814  0.5149290   0.4002567   0.2196074
2   0.9514976   NA          NA          0.7689985   0.8700596
3   0.5431010   0.02019813  NA          0.4964349   0.8550961
4   0.7627217   0.95688326  0.6535286   0.6048702   NA
5   0.5507881   0.18073649  NA          NA          NA

我希望只保留除截距之外的所有列的值低于 0.5 的所有行。比如上面的第1行。

我试过这个,但它是错误的。

subset(df, (ma1 < 0.5 | ma2 < 0.5 |a1 < 0.5 |a2 < 0.5)  | is.na(df) )

【问题讨论】:

    标签: r dataframe dplyr subset


    【解决方案1】:

    dplyr 选项:

    library(dplyr)
    
    df %>%
      filter_at(vars(-intercept), all_vars(. < 0.5 | is.na(.)))
    

    【讨论】:

      【解决方案2】:

      您可以使用rowSums 对行进行子集化,但截距除外,其中所有值都低于 0.5 或为 NA

      df[rowSums(is.na(df[,-3]) | df[,-3] < .5) == 4,]
      #           ma1        ma2 intercept         a1         a2
      #1   0.39918844 0.17579814 0.5149290 0.40025665 0.21960743
      #9           NA         NA        NA         NA 0.08313134
      #10          NA 0.36866246        NA         NA 0.09855370
      #11          NA         NA        NA         NA         NA
      #17  0.13574650         NA 0.2091131         NA 0.45498907
      #25  0.34423528         NA        NA 0.48560181         NA
      #29          NA         NA 0.5190011         NA         NA
      #30          NA         NA 0.4044907         NA         NA
      #45          NA         NA 0.2148494         NA         NA
      #55  0.12741453 0.48216535        NA         NA         NA
      #56          NA         NA 0.5961191 0.28201553         NA
      #60  0.41193395         NA 0.6991763 0.06934950         NA
      #70          NA 0.05513079        NA         NA         NA
      ##76          NA         NA 0.1795053 0.12942907         NA
      #81  0.22508650 0.15765847        NA         NA 0.26826415
      #83          NA 0.36059247 0.2204349         NA 0.01762806
      #85          NA         NA        NA         NA 0.22727065
      #86          NA         NA 0.9632994 0.18117912 0.36007075
      #90          NA 0.25226895 0.7613491         NA         NA
      #91  0.39435732 0.12868162 0.5080502 0.02773209 0.24738992
      #92          NA 0.11217552 0.7318231 0.45437576         NA
      #100 0.07790454 0.32215644 0.1069091         NA 0.39871277
      

      或者没有NA:

      df[rowSums(is.na(df[,-3]) | df[,-3] >= .5) == 0,]
      #         ma1       ma2 intercept         a1        a2
      #1  0.3991884 0.1757981 0.5149290 0.40025665 0.2196074
      #91 0.3943573 0.1286816 0.5080502 0.02773209 0.2473899
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多