Если столбец с именем содержит частичное значение, сохраняйте строки

У меня есть набор данных:

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

3 ответа

Решение

С базой R вы можете попробовать:

df_cols <- df[, grepl("Camp", names(df))]
df[apply(df_cols, 1, function(x) all(grepl("A|B", x) | is.na(x))), ]

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

На первом этапе он идентифицирует столбцы, в названии которых содержится слово "Лагерь", а затем подгруппирует данные на основе заданного условия.

Мы можем использовать filter_at от dplyr, С использованием starts_with вспомогательная функция, мы применяем фильтр к каждому столбцу, который начинается с 'Camp', По этим столбцам мы фильтруем строки, где all_vars содержать A или же B или же 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))

Вот решение в стиле Tidyverse.

С помощью filter_at:

my_df %>%
    filter_at(vars(matches('Camp')), all_vars(is.na(.) | str_detect(., 'A|B')))

Вот, vars(matches('Camp')) говорит фильтровать столбцы, имена которых содержат строку Campи all_vars(...) говорит, чтобы сохранить только те строки, где все столбцы [которые соответствуют 'Camp'] соответствуют указанным критериям.

Вам нужно будет сделать require(tidyverse) а также require(stringr) чтобы это работало.

Другие вопросы по тегам