R子集数据帧-最大值和NA

时间:2019-09-19 08:57:52

标签: r

我进行了以下测试-数据框

df <- data.frame(V1 = c(1, 2, 3), V2 = c(0, 5, NA), V3=c(NA, 10, NA), V4=c(2, 2, NA))    

> df

   V1 V2 V3 V4
 1  1  0 NA  2
 2  2  5 10  2
 3  3 NA NA NA       

现在,我想对该数据帧进行子集化:

  • 保留V2:V4的最大值小于3的行

OR

  • 保留所有V2:V4均为NA的行

所以结果应该像这样:

df_new

   V1 V2 V3 V4
 1  1  0 NA  2
 3  3 NA NA NA   

仅保留原始数据帧的第一行和第三行。

我可以使用以下命令:

subset(DF, (is.na(V2) & is.na(V3) & is.na(V4)) | ((V2 < 3 | is.na(V2)) & (V3 < 3 | is.na(V3)) & (V4 < 3 | is.na(V4))))

为此。但这很繁琐,而且在我的实际数据框中,要检查的列超过30列,因此必须有一种更好的方法。

2 个答案:

答案 0 :(得分:2)

您可以这样做:

df[rowSums(df[, 2:4] >= 3, na.rm = TRUE) == 0, ]

  V1 V2 V3 V4
1  1  0 NA  2
3  3 NA NA NA

答案 1 :(得分:0)

dplyr中,我们可以使用filter_at选择要检查的特定列,将replace NA的值设置为0,并选择所有值均小于3的行。 / p>

library(dplyr)
df %>% filter_at(vars(V2:V4), all_vars(replace(., is.na(.), 0) < 3))

#  V1 V2 V3 V4
#1  1  0 NA  2
#2  3 NA NA NA