我有一个如下数据框:
有200多个列,这只是一个示例。
Col1 Col2 Col2-A Col3 Col3-A
1 3 BA 0 BA
2 5 BA 1 NA
3 7 BA 0 JN
5 9 KD 1 BA
9 10 BA 4 NA
如何过滤/子集该数据集,以便基于包含-A
的列,删除包含BA
或NA
以外的任何行。
最终预期输出:
Col1 Col2 Col2-A Col3 Col3-A
1 3 BA 0 BA
2 5 BA 1 NA
9 10 BA 4 NA
答案 0 :(得分:1)
这是一种非常简单的方法:
cols = grepl("-A", names(dd))
rows = rowSums(dd[, cols] == "BA" | is.na(dd[, cols])) == sum(cols)
dd[rows, ]
# Col1 Col2 Col2-A Col3 Col3-A
# 1 1 3 BA 0 BA
# 2 2 5 BA 1 <NA>
# 5 9 10 BA 4 <NA>
使用此数据:
dd = read.table(header = T, text = 'Col1 Col2 Col2-A Col3 Col3-A
1 3 BA 0 BA
2 5 BA 1 NA
3 7 BA 0 JN
5 9 KD 1 BA
9 10 BA 4 NA', check.names = F)
答案 1 :(得分:1)
使用dplyr
,您可以执行以下操作:
df %>%
filter_at(vars(contains(".A")), all_vars(grepl("BA", .) | is.na(.)))
Col1 Col2 Col2.A Col3 Col3.A
1 1 3 BA 0 BA
2 2 5 BA 1 <NA>
3 9 10 BA 4 <NA>
它基于包含“ .A”的变量进行过滤,并保留所有变量均为“ BA”或NA的行。
或基于@Gregor帖子的简化版本:
df %>%
filter_at(vars(contains(".A")), all_vars(. == "BA" | is.na(.)))
样本数据:
df <- read.table(text = "Col1 Col2 Col2-A Col3 Col3-A
1 3 BA 0 BA
2 5 BA 1 NA
3 7 BA 0 JN
5 9 KD 1 BA
9 10 BA 4 NA", header = TRUE, stringsAsFactors = FALSE)