【问题标题】:Reshaping R dataframe (compute average of a column based on multiple 'level' columns)重塑 R 数据框(基于多个“级别”列计算列的平均值)
【发布时间】:2019-10-08 06:48:24
【问题描述】:

我有一个具有这种结构的 R 数据框(虚拟示例):

df 

A B C D
1 a 3 5
1 a 5 3
1 b 2 8
2 a 4 7
2 a 6 5
2 b 4 3

...

“A”、“B”、“C”和“D”是列标题。

我想重塑这个数据框,以便通过“A”和“B”的每个级别获得“C”和“D”的平均值。

所以我想要的最终产品是:

new_df

A BaC BbC BaD BbD 
1  4   2   4   8
2  5   4   6   3

我设法以非常粗暴的方式做到了:

spread_df_C <- spread(df, B, C)
aggregated_df_C <- aggregate(spread_df$a, list(spread_df$A), mean)

spread_df_D <- spread(df, B, D)
aggregated_df_D <- aggregate(spread_df$a, list(spread_df$A), mean)

new_df <- merge(aggregated_df_C, aggregated_df_D, by=c("A", "A")

这最终会让我得到最终产品,但我正在费力地计算每个级别的平均值。我需要为多个级别执行此操作,并且必须有更优雅的执行方式。

请各位高手帮忙

【问题讨论】:

    标签: r dataframe aggregate reshape data-manipulation


    【解决方案1】:

    使用reshape2 包的选项。

    library(reshape2)
    dcast(melt(dat, measure.vars = c("C", "D")), A ~ B + variable, fun.aggregate = mean)
    #  A a_C a_D b_C b_D
    #1 1   4   4   2   8
    #2 2   5   6   4   3
    

    第一步是meltCD,然后将生成的数据帧转换回宽格式。

    【讨论】:

      【解决方案2】:

      使用tidyverse,您可以:

      df %>%
       gather(var, val, -c(1:2)) %>%
       group_by_at(1:3) %>%
       summarise(val = mean(val)) %>%
       ungroup() %>%
       mutate(var = paste(var, B, sep = "_")) %>%
       select(-2) %>%
       spread(var, val)
      
            A   C_a   C_b   D_a   D_b
        <int> <dbl> <dbl> <dbl> <dbl>
      1     1     4     2     4     8
      2     2     5     4     6     3
      

      【讨论】:

        【解决方案3】:

        在聚合后考虑基 R 的reshape 以及在句点之前/之后的列名切换:

        agg <- aggregate(. ~ A + B, df, mean)
        rdf <- reshape(agg, idvar = "A", timevar = "B",  direction = "wide")
        
        names(rdf)[-1] <- paste0("B", substr(names(rdf)[-1], 3, 3), substr(names(rdf)[-1], 1, 1))
        
        rdf
        #   A BaC BaD BbC BbD
        # 1 1   4   4   2   8
        # 2 2   5   6   4   3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          • 2015-11-02
          • 1970-01-01
          • 2017-12-04
          • 2015-04-11
          • 2020-05-22
          • 1970-01-01
          相关资源
          最近更新 更多