首页 > 解决方案 > 如果具有名称的列包含部分值,则保留行

问题描述

我有一个数据集:

Camp1    Ade2    Camp3    Ade4    
   dA       1       eB       2
   dB       4       uC       8
   gB       3       NA      NA

如果名称中包含“Camp”的列名不包含值“A”或“B”或 NA,我如何子集此数据集,排除这些行。

我知道如何做到完全匹配,但不是部分匹配。

cols = grepl("Camp", names(df))
rows = rowSums(df[, cols] == "A" | 
df[, cols] == "B" |
is.na(df[, cols])) == sum(cols)
df<-df[rows, ]

我如何做等效但部分匹配?

预期输出:

Camp1    Ade2    Camp3    Ade4    
   dA       1       eB       2
   gB       3       NA      NA

标签: rgrepl

解决方案


我们可以使用filter_atfrom dplyr。使用starts_with辅助函数,我们将过滤器应用于以 . 开头的每一列'Camp'。在这些列上,我们过滤all_vars包含AorB或的行NA

library(dplyr)

df %>%
  filter_at(vars(starts_with("Camp")), all_vars(grepl('A|B', .) | is.na(.)))

输出:

  Camp1 Ade2 Camp3 Ade4
1    dA    1    eB    2
2    gB    3  <NA>   NA

数据:

df <- structure(list(Camp1 = structure(1:3, .Label = c("dA", "dB", 
"gB"), class = "factor"), Ade2 = c(1L, 4L, 3L), Camp3 = structure(c(1L, 
2L, NA), .Label = c("eB", "uC"), class = "factor"), Ade4 = c(2L, 
8L, NA)), class = "data.frame", row.names = c(NA, -3L))

推荐阅读