group_by, но проводить операции только по одной из групп? - PullRequest
1 голос
/ 28 января 2020

есть ли способ использовать dplyr group_by, но действовать только на подмножество групповой переменной?

Например, я хочу что-то вроде следующей строки, где я создаю переменную, которая сообщает только значения для group = = да:

df%>%group_by(group=='yes')%>%mutate(min=min(value))

и когда группа == 'нет', min будет NA. Я знаю, что я мог бы фильтровать заранее, но я все еще хочу сохранить группу == 'нет'

  value group want
1   1.2   yes  1.2
2   1.7   yes  1.2
3   1.0    no   NA
4   2.0    no   NA

Ответы [ 2 ]

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

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

library(dplyr)
df %>%          
      mutate(Min = case_when(group == 'yes' ~
                     min(value[group == 'yes'])))

РЕДАКТИРОВАТЬ: на основе комментариев из @IceCreamToucan (если мы оставим TRUE ~ NA_real_, он автоматически заполнит остальные NA по умолчанию)

или преобразовать другие значения в NA с

df %>% 
    mutate(Min = min(value[group == 'yes']) * NA^(group != 'yes'))

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

mtcars %>%
    mutate(Min = case_when(am ==1 ~ min(cyl[am == 1]), TRUE ~ NA_real_))

или без case_when

mtcars %>% 
       mutate(Min = min(cyl[am == 1]) * NA^(am != 1))
1 голос
/ 29 января 2020

Мы можем filter с group == 'yes', получить min, а затем сделать right_join с исходными данными, чтобы получить 'no' строк.

library(dplyr)

df %>% 
  filter(group == "yes") %>% 
  mutate(min = min(value, na.rm = TRUE)) %>%  
  right_join(df)

#  value group min
#1   1.2   yes 1.2
#2   1.7   yes 1.2
#3   1.0    no  NA
#4   2.0    no  NA

В базе R это можно сделать с помощью subset и merge

merge(df, transform(subset(df, group == 'yes'), min = min(value)), all.x = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...