Dplyr, фильтрация групп, если существует какое-либо значение в списке векторов - PullRequest
0 голосов
/ 28 января 2020

[РЕДАКТИРОВАТЬ: Включенный воспроизводимый пример с использованием dput]

Я хочу отфильтровать по группирующей переменной, если в группе существует какой-либо вектор значений в переменной, т.е. не может быть групп, где любая переменная (Значение V) V1, V2 или V3.

Например, могут не остаться группы, в которых присутствует дерево, восприимчивое к штамму / типу болезни V1, V2 или V3.

Однако мои звонки продолжают интерпретироваться: деревья в группе, восприимчивой к болезням штамма / травмы типа V1, V2 или V3.

Пример 1:

df %>% group_by(tree_group) %>% 
  filter(any(!(tree_condition %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(any(!(injury_type_1 %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(any(!(injury_type_2 %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(any(!(injury_type_3 %in% c("Significant","Severe","Dead or dying"))))

Пример 2:

df  %>% group_by(tree_group) %>% 
  filter(!(any(tree_condition %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(!(any(injury_type_1 %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(!(any(injury_type_2 %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(!(any(injury_type_3 %in% c("Significant","Severe","Dead or dying"))))

Оба пример 1 и пример 2 дают одинаковый результат - поврежденные деревья удаляются из групп, а группы инцидентов не удаляются из вызова.

Я также попытался, но безуспешно, создать переменную (DAMAGED), чтобы пометить все деревья в группе с 1, для восприимчивого, если один член был восприимчивым, и еще 0:

df %>% 
group_by(tree_group) %>% mutate(if (tree_condition %in% c("Significant","Severe","Dead or dying")){
    DAMAGED=1
  } else if(injury_type_1 %in% c("Significant","Severe","Dead or dying")) {
    DAMAGED=1
  } else if(injury_type_2 %in% c("Significant","Severe","Dead or dying")) {
    DAMAGED=1
  } else if(injury_type_3 %in% c("Significant","Severe","Dead or dying")) {
    DAMAGED=1
  } else {
    DAMAGED=0
  })

Однако это выдает условие как:

1: In if (tree_condition %in% c("Significant", "Severe", "Dead or dying")) { :
  the condition has length > 1 and only the first element will be used
2: In if (injury_type_1 %in% c("Significant", "Severe", "Dead or dying")) { :
  the condition has length > 1 and only the first element will be used
3: In if (injury_type_2 %in% c("Significant", "Severe", "Dead or dying")) { :
  the condition has length > 1 and only the first element will be used
4: In if (injury_type_3 %in% c("Significant", "Severe", "Dead or dying")) { :
  the condition has length > 1 and only the first element will be used

Пример данных:

df <- structure(list(tree_id = c("F41030808008", "F41030808008", "F41030808008", "F41030808008", "F41031302007", "F41031302007", "F41031302007", "F41031302007", "F41031302007", "F41031302007", "F41030808008", "F41030808008"), Siteid = c("F410", "F410", "F410", "F410", "F410", "F410", "F410", "F410", "F410", "F410", "F410", "F410"), injury_type_1 = c(NA,NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Dead or dying"), injury_type_2 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), injury_type_3 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), height = c(NA, NA, 122, 5, NA, 35, 185, 245, 300, 102, NA, NA)), row.names = c(NA, -12L), class = "data.frame")

Результат, который я хочу:

expected_result <– structure(list(tree_id = c("F41031302007", "F41031302007", "F41031302007", "F41031302007", "F41031302007", "F41031302007"), Siteid = c("F410", "F410", "F410", "F410", "F410", "F410"), injury_type_1 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), injury_type_2 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), injury_type_3 = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), height = c(NA, 35, 185, 245, 300, 102)), row.names = c(NA, -6L), class = "data.frame")

Ответы [ 2 ]

1 голос
/ 28 января 2020

Мы можем использовать filter_at

library(dplyr)
df %>%
   group_by(tree_group) 
   filter_at(vars(tree_condition, matches('^injury_type_\\d+$')), 
          any_vars(!. %in%  c("Significant","Severe","Dead or dying")))
0 голосов
/ 29 января 2020

Решено:

Я адаптировал следующее из ответа в другой теме.

Как удалить группы наблюдений с помощью dplyr :: filter ()

Мой окончательный код:

df %>% group_by(tree_group) %>% 
  filter(all(!(tree_condition %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(all(!(injury_type_1 %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(all(!(injury_type_2 %in% c("Significant","Severe","Dead or dying")))) %>%
  filter(all(!(injury_type_3 %in% c("Significant","Severe","Dead or dying"))))

Этот код удаляет все наблюдения в группе с переменной с одним или несколькими значениями «Значительный», «Серьезный», «Мертвый или умирающий» из отфильтрованный набор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...