我有以下测试数据
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 现在,我想对这个数据进行子集:
的行
或
的行
结果应该是这样的:
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列,因此必须有更好的方法来完成这一任务。
发布于 2019-09-19 09:00:31
你可以:
df[rowSums(df[, 2:4] >= 3, na.rm = TRUE) == 0, ]
V1 V2 V3 V4
1 1 0 NA 2
3 3 NA NA NA发布于 2019-09-19 09:24:09
在dplyr中,我们可以使用filter_at选择要检查的特定列,将replace NA值选择为0,并选择所有值都小于3的行。
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 NAhttps://stackoverflow.com/questions/58007323
复制相似问题