Удалить строки, в которых выполняется несколько условий для выбранных столбцов

#r #dplyr #data.table

#r #dplyr #данные.таблица

Вопрос:

У меня есть фрейм данных примерно из 1000 столбцов. Меня интересуют 14 переменных оценки удовлетворенности.

Мне нужно удалить строки, в которых любая из 14 переменных рейтинга содержит «Пропущенный элемент» или NA.

Есть ли способ удалить все строки, в которых NA или «Элемент пропущен» отображаются в моем векторе интересующих переменных рейтинга удовлетворенности, в настоящее время в векторе ‘cols’. В приведенном ниже примере ‘cols’ содержит сервис, эффективность и вкус, но НЕ опыт и качество

 cols = c("Service","Efficiency","Flavour")
dat<-data.frame(Number = 1:6, University = c("A","B","C","D","E","F"), 
                Service=c("Satisfied","Item skipped",NA, "Not satisfied", "Neither","Item skipped" ), 
                Efficiency =c("Neither", "Neither", "Item skipped","Satisfied", NA, NA),
                Flavour =c("Satisfied", NA, "Item skipped",
                                     "Neither", NA, NA), Quality =c("Not satisfied", "Neither", NA,"Satisfied", NA, NA),
                Experience =c("Satisfied", NA, NA,
                                     "Not satisfied", NA, NA),Age =rep(c(18:19), times =3))

  

Ответ №1:

В базовом R мы можем использовать rowSums для удаления строк, в которых «Элемент пропущен» или NA присутствует в cols

 cols = c("Service", "Efficiency", "Flavour")

dat[rowSums(dat[cols] == "Item skipped" | is.na(dat[cols])) == 0, ]

#  Number University       Service Efficiency   Flavour       Quality    Experience Age
#1      1          A     Satisfied    Neither Satisfied Not satisfied     Satisfied  18
#4      4          D Not satisfied  Satisfied   Neither     Satisfied Not satisfied  19
  

Альтернативное использование, apply предложенное @amrrs

 dat[!apply(dat[cols], 1, function(x) any(x == 'Item skipped' | is.na(x))), ]
  

Ответ №2:

РЕДАКТИРОВАТЬ:: Используя обновленные данные, которые мы могли бы использовать (это при условии, что NA всегда отображается с «Item_Skipped», что, похоже, имеет место):

  dat %>% 

     filter(!is.na(Experience))  

        Number University       Service Efficiency   Flavour       Quality    Experience Age
    1       1          A     Satisfied    Neither Satisfied Not satisfied     Satisfied  18
    2       4          D Not satisfied  Satisfied   Neither     Satisfied Not satisfied  19
  

Оригинал::

Мы могли бы использовать (данные в примечании ниже):

 dat %>% 
  filter_at(vars(contains("rating")),all_vars(.!="Item Skipped"))
  

или::

 dat %>% 
  filter_all(all_vars(.!="Item Skipped"))
  

Вывод:

  Number University Service_rating Efficiency_rating Flavour_rating Age
1      1          A      Satisfied           Neither      Satisfied  18
2      4          D  Not satisfied         Satisfied        Neither  19
  

ПРИМЕЧАНИЕ:

 dat<-data.frame(Number = 1:6, University = c("A","B","C","D","E","F"), 
                Service_rating=c("Satisfied","Item skipped",NA, "Not satisfied", "Neither","Item skipped" ), 
                Efficiency_rating =c("Neither", "Neither", "Item skipped","Satisfied", NA, NA),
                Flavour_rating =c("Satisfied", NA, "Item skipped",
                                  "Neither", NA, NA), Age =rep(c(18:19), times =3))
  

Комментарии:

1. только что изменил это — столбцы рейтинга имеют произвольные имена. необходимо сделать это по ссылке на вектор имен столбцов рейтинга ‘cols’

2. Не могли бы вы добавить, что cols такое? Я не могу обмозговать это.

3. прошу прощения, ссылки в приведенном выше списке — это три рейтинга. далее адаптировали data.frame. существует много рейтинговых столбцов, но меня интересуют только некоторые из них