我希望有一个数据帧,其中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) )
dplyr
选项:
library(dplyr)
df %>%
filter_at(vars(-intercept), all_vars(. < 0.5 | is.na(.)))
您可以使用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