R dplyr `group_by`, кажется, не работает для создания нового значения, используя` case_when`? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать новый столбец во фрейме данных на основе групп site и условий с использованием case_when. Однако мой вывод, кажется, игнорирует мои группы?

Мой пример:

site     = c("a", "b", "b", "d", "d", "d", "e", "f", "g")
distance = c("PA", "PA", "5", "PA", "20", "5", "5", "20", "PA")
df <- data.frame(site, 
                 distance)

Применить условия:

  • если в группе есть только PA -> PA
  • если есть PA и что-то еще -> неясно
  • если есть что-то другое (не PA) -> буфер

Скрипт:

df %>% 
  group_by(site) %>% 
  mutate(source = case_when(distance == "PA" ~ "PA",
                            any(c("PA") %in% distance) ~ "unclear",
                            TRUE ~ "buffer")) 

Мой пример работает хорошо по строкам, но без учета групп?

Ожидаемый результат по группе site:

  site  distance source 
  <fct> <fct>    <chr>  
1 a     PA       PA     
2 b     PA       unclear    # not PA
3 b     5        unclear
4 d     PA       unclear    # not PA, as the group contains other values! 
5 d     20       unclear
6 d     5        unclear
7 e     5        buffer 
8 f     20       buffer 
9 g     PA       PA     

1 Ответ

4 голосов
/ 20 апреля 2020

Вы должны использовать следующие условия:

library(dplyr)

df %>% 
  group_by(site) %>% 
  mutate(source = case_when(
                    #if there is only PA by group
                    all(distance == "PA") ~ "PA",
                    #PA + something else
                    any(distance == "PA") && any(distance != "PA") ~ "unclear",
                    #everything else
                    TRUE ~ "buffer")) 


#  site  distance source 
#  <fct> <fct>    <chr>  
#1 a     PA       PA     
#2 b     PA       unclear
#3 b     5        unclear
#4 d     PA       unclear
#5 d     20       unclear
#6 d     5        unclear
#7 e     5        buffer 
#8 f     20       buffer 
#9 g     PA       PA     
...