子集包含字符串按列名称的行-Grepl

时间:2019-01-29 18:21:20

标签: r dplyr grepl

我有一个如下数据框:

有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的列,删除包含BANA以外的任何行。

最终预期输出:

Col1    Col2    Col2-A   Col3   Col3-A
   1       3        BA      0       BA
   2       5        BA      1       NA
   9      10        BA      4       NA

2 个答案:

答案 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)