【问题标题】:applying function to each group using dplyr and return specified dataframe使用 dplyr 将函数应用于每个组并返回指定的数据帧
【发布时间】:2020-10-05 16:13:15
【问题描述】:

我第一次使用 group_map 并认为我做得对。这是我的代码:

library(REAT)

df <- data.frame(value = c(1,1,1, 1,0.5,0.1, 0,0,0,1), group = c(1,1,1, 2,2,2, 3,3,3,3))

haves <- df %>%
    group_by(group) %>%
    group_map(~gini(.x$value, coefnorm = TRUE)) 

问题是 hass 是一个列表而不是一个数据框。我该怎么做才能获得这个df

wants <- data.frame(group = c(1,2,3), gini = c(0,0.5625,1))

group gini
1   0.0000
2   0.5625
3   1.0000

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以使用dplyr::summarize:

    df %>%
        group_by(group) %>%
        summarize(gini = gini(value, coefnorm = TRUE))
    
    #> # A tibble: 3 x 2
    #>   group  gini
    #>   <dbl> <dbl>
    #> 1     1 0    
    #> 2     2 0.562
    #> 3     3 1 
    

    【讨论】:

    • 我一定是愚蠢的,因为我没有想到这一点。 gini 基本上是一个函数,如中值、n_distinct 等......
    【解决方案2】:

    根据文档,group_map 总是生成一个列表。 group_modify 是一种替代方法,如果函数会产生一个小标题,但 gini 只输出一个向量。所以,你可以做这样的事情......

    df %>%
      group_by(group) %>%
      group_modify(~tibble(gini = gini(.x$value, coefnorm = TRUE)))
    
    # A tibble: 3 x 2
    # Groups:   group [3]
      group  gini
      <dbl> <dbl>
    1     1 0    
    2     2 0.562
    3     3 1  
    

    【讨论】:

    • 谢谢 - 感激不尽。
    【解决方案3】:

    使用data.table

    library(data.table)
    setDT(df)[, .(gini = gini(value, coefnorm = TRUE)), group] 
    

    对于分组数据集,如果我们不想使用不带引号的列名,我们可以指定 .data

    library(dplyr)
    df %>%
       group_by(group) %>%
       summarize(gini = gini(.data$value, coefnorm = TRUE))
    

    【讨论】:

    • 谢谢。几乎不使用 data.tables,但它们更具可扩展性 AFAIK?
    猜你喜欢
    • 2019-10-02
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2017-12-23
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多