我进行了以下测试-数据框
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
现在,我想对该数据帧进行子集化:
OR
所以结果应该像这样:
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列,因此必须有一种更好的方法。
答案 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