#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. существует много рейтинговых столбцов, но меня интересуют только некоторые из них