【问题标题】:Return multiple values based on duplicate max values in another column根据另一列中重复的最大值返回多个值
【发布时间】:2020-01-24 10:20:48
【问题描述】:

我想使用多个函数按组汇总一个 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$a) 中的 max(df1$c) 时,它会询问 df1$b 的值。当结果为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 的不同值出现两次。

错误:列“maxc”的长度必须为 1(汇总值),而不是 2

是否有一个优雅的解决方案,通过它 dplyr 返回两个值,同时执行另一个对 summarise() 的调用(例如,通过在对 group_by 的调用中添加 do())?在我的应用案例中,我尝试对summarise 运行几个不同的调用,除了使用namax 函数的调用。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以将值放在列表中,即

    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
    

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2021-10-16
      • 2014-02-04
      • 2022-09-30
      • 2018-05-27
      • 2012-05-29
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多