Подмножество строк, содержащих строку По именам столбцов - Grepl - PullRequest
0 голосов
/ 29 января 2019

У меня есть кадр данных, как показано ниже:

Здесь более 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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

С помощью 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)
0 голосов
/ 29 января 2019

Вот довольно простой способ:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...