Подмножество определенных столбцов, игнорируя значения NA - PullRequest
1 голос
/ 20 апреля 2020

Я ищу фрейм данных, где все значения 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) )

Ответы [ 2 ]

3 голосов
/ 20 апреля 2020

A dplyr опция:

library(dplyr)

df %>%
  filter_at(vars(-intercept), all_vars(. < 0.5 | is.na(.)))
1 голос
/ 20 апреля 2020

Вы можете использовать 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
...