Возврат нескольких значений на основе повторных максимальных значений в другом столбце - PullRequest
0 голосов
/ 24 января 2020

Я хочу суммировать df по группам, используя несколько функций. Данные репликации:

library(dplyr)
df1 <- data.frame(a=c('a', 'a', 'b', 'b', 'c', 'c'), b=c(1,NA,3,2,2,1), c=c(1,3,5,5,2,4))

Одной из них является пользовательская функция, которая запрашивает значение df1$b, когда max(df1$c) в каждой группе (df1$a). Когда результат равен NA, он должен вернуть значение для df1$b для второго по величине значения df1$c. Следующие работы:

namax <- function(x,y) ifelse(is.na(y[x==max(x)] & length(x)>1),
                              y[x==sort(x,partial=length(x)-1)[length(x)-1]], y[x==max(x)])

Затем я пытаюсь суммировать df1, используя:

df2 <- df1 %>%
  dplyr::group_by(a) %>%
  summarise(meanc = mean(c),
            maxc = namax(c,b))

, который возвращает следующее, потому что для df$a == 'b' происходит максимальное значение df1$c дважды для разных значений df1$b.

Ошибка: столбец 'max c' должен иметь длину 1 (суммарное значение), а не 2

Существует ли элегантное решение, посредством которого dplyr возвращает оба значения , одновременно выполняя другой вызов summarise() (например, добавив do() к вызову group_by)? В моем случае я пытаюсь выполнить несколько разных вызовов на summarise, кроме звонка с использованием функции namax.

1 Ответ

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

Вы можете поместить значения в список, например

library(dplyr)

 df1 %>%
     group_by(a) %>%
     summarise(meanc = mean(c),
               maxc = list(namax(c, b)))

# A tibble: 3 x 3
#  a     meanc maxc     
#  <fct> <dbl> <list>   
#1 a         2 <dbl [1]>
#2 b         5 <dbl [2]>
#3 c         3 <dbl [1]>

Вы можете использовать unnest() для расширения,

df1 %>%
     group_by(a) %>%
     summarise(meanc = mean(c),
               maxc = list(namax(c, b))) %>% 
     unnest()

# A tibble: 4 x 3
#  a     meanc  maxc
#  <fct> <dbl> <dbl>
#1 a         2     1
#2 b         5     3
#3 b         5     2
#4 c         3     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...