Как выбрать строки во фрейме данных хотя бы с одной переменной с отсутствующим значением? - PullRequest
2 голосов
/ 31 марта 2020

В кадре данных я хочу, чтобы только строки, в которых хотя бы одна переменная начиналась с DSDECOD, НЕ были пустыми. Как я могу это сделать?

кажется, что следующий код работает.

ds_sub <- subset(ds_supp, (DSDECOD1 !="" | DSDECOD2 !="" |
    DSDECOD3 !="" | DSDECOD4 !=""))

Но есть простой способ, чтобы мне не пришлось выписывать все переменные, начинающиеся с DSDECOD ?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Возможно использование rowSums и grepl:

ds_supp[rowSums(ds_supp[, grepl("^DSDECOD", names(ds_supp))]!="")>0,]

  ID DSDECOD1 DSDECOD2 DSDECOD3 DSDECOD4
1  1                          B         
2  2        A                 A        A
3  3        B                          B
5  5        C                 C        C
6  6                          D        D

Данные :

  ID DSDECOD1 DSDECOD2 DSDECOD3 DSDECOD4
1  1                          B         
2  2        A                 A        A
3  3        B                          B
4  4                                     # <- empty row
5  5        C                 C        C
6  6                          D        D
0 голосов
/ 31 марта 2020

Это решение для регулярных выражений работает:

df[-which(grepl("\\d$", apply(df, 1, paste0, collapse = ""))),]

   id DSDECOD1 DSDECOD2 DSDECOD3
1   1                 A         
2   2        B                  
3   3                          A
4   4                 B         
8   8                          A
9   9                          B
10 10                          A

Это решение работает, paste0 объединяя строки вместе, а затем вычитая из кадра данных эти строки which end ($) в di git (\\d), что происходит только при пустых строках DSDECOD:

Воспроизводимые данные :

df <- data.frame(
  id = 1:10,
  DSDECOD1 = c("", "B", rep("",8)),
  DSDECOD2 = c("A","","","B","","","","","",""),
  DSDECOD3 = c("", "", "A", "","","","", "A", "B", "A"))

df
   id DSDECOD1 DSDECOD2 DSDECOD3
1   1                 A         
2   2        B                  
3   3                          A
4   4                 B         
5   5                             # empty 
6   6                             # empty 
7   7                             # empty
8   8                          A
9   9                          B
10 10                          A
0 голосов
/ 31 марта 2020

Вы можете попробовать использовать select и функцию remove_empty из пакета janitor?

ds_sub %>%
select(contains("DSDECOD")) %>%
janitor::remove_empty(.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...