【问题标题】:How to aggregate two different columns with two different functions in R dataframe如何在 R 数据框中使用两个不同的函数聚合两个不同的列
【发布时间】:2020-02-02 02:53:54
【问题描述】:

我有一个数据框,其中有一些重复的记录,我需要汇总重复的记录,以便每行都有唯一的记录。

一个例子:

Col1    Col2    Col3    Col4
A       0.170   83     0.878
B       0.939   103    0.869
C       0.228   80     0.935
D       0.566   169    0.851
D       0.566   137    0.588
E       0.703   103    0.636

我需要用 Col3 对 Col4 的平均值进行加权,然后对 Col3 求和。所以我的结果是:

Col1    Col2    Col3    Col4
A      0.17     83     0.878
B      0.939    103    0.869
C      0.228    80     0.935
D      0.566    306    0.733
E      0.703    103    0.636

通常我会使用聚合函数,但我似乎找不到包含两种不同函数类型的解决方案。还有另一种方法可以做到这一点吗?我实际上忽略了 Col 2,因为在与引入 Col3 和 Col4 的数据合并之前的粒度是每行一条记录,现在它正在被复制。

谢谢!!

【问题讨论】:

    标签: r dataframe sum aggregate weighted-average


    【解决方案1】:

    使用dplyr,您可以使用group_by 保留“Col1”的所有唯一行,然后将所有不同的函数传递给summarise。以您的示例为例,它可能是这样的。

    注意:要通过 Col3 计算 Col4 的 weighted.mean,需要在计算 Col3 的 sum 之前通过此函数,否则 Col4 和 Col3 的长度会不同。

    然后您可以使用select 以正确的顺序重新组织您的数据框:

    library(dplyr)
    df %>% group_by(Col1) %>%
      summarise(Col2 = mean(Col2),
                Col4 = weighted.mean(Col4,Col3),
                Col3 = sum(Col3)) %>%
      select(Col1,Col2,Col3,Col4)
    
    # A tibble: 5 x 4
      Col1   Col2  Col3  Col4
      <chr> <dbl> <int> <dbl>
    1 A     0.17     83 0.878
    2 B     0.939   103 0.869
    3 C     0.228    80 0.935
    4 D     0.566   306 0.733
    5 E     0.703   103 0.636
    

    数据

    structure(list(Col1 = c("A", "B", "C", "D", "D", "E"), Col2 = c(0.17, 
    0.939, 0.228, 0.566, 0.566, 0.703), Col3 = c(83L, 103L, 80L, 
    169L, 137L, 103L), Col4 = c(0.878, 0.869, 0.935, 0.851, 0.588, 
    0.636)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
    ), .internal.selfref = <pointer: 0x561706072cc0>)
    

    【讨论】:

    • 谢谢!我无法让代码实际应用。它说它运行了,但 df 看起来与原始文件完全相同。我尝试了基本解决方案,这个解决方案奏效了!我仍然不确定 dplyr 出了什么问题...
    • 没问题 ;) 代码将计算新的列值,但不会更改 df。如果您想永久传递这些更改,您需要执行df &lt;- df %&gt;% ...。但如果它适用于 base r,那也很好。
    • 谢谢!让我试试...我一定忘记了那一步:/使用其他基本代码,它似乎创建了一个数据框(根据类())但它们是列表,我无法将其导出到文本文件。 :( 我会再次尝试保存它!
    • 不客气。我认为您至少应该支持@hello 朋友的答案,因为它提供了有用的答案;)
    • 谢谢!抱歉,我仍然习惯于堆栈溢出如何用于发布。刚刚做了!
    【解决方案2】:

    基础 R 解决方案:

    aggregated_df <- data.frame(do.call("rbind", lapply(split(df, df$Col1), function(x){
            list(Col1 = unique(x$Col1), Col2 = mean(x$Col2), Col3 = sum(x$Col3), 
                       Col4 = weighted.mean(x$Col4, x$Col3))
          }
        )
      ),
    stringsAsFactors = FALSE)
    

    数据:

    df <-
      structure(
        list(
          Col1 = c("A", "B", "C", "D", "D", "E"),
          Col2 = c(0.17,
                   0.939, 0.228, 0.566, 0.566, 0.703),
          Col3 = c(83L, 103L, 80L,
                   169L, 137L, 103L),
          Col4 = c(0.878, 0.869, 0.935, 0.851, 0.588,
                   0.636)
        ),
        row.names = c(NA,-6L),
        class = c("data.frame"
        ))
    

    【讨论】:

    • 谢谢!但是,由于结果是列表,我无法导出结果。即使该类是一个数据框。我尝试排除故障,但可能需要花费更多时间。
    • @pav 由于 rbind 函数应用于列表,结果应该是单个数据帧。请尝试 View(aggregated_df) 看看是否能看到想要的结果。
    • 好的,谢谢!我可以看到结果,但即使它是一个数据框,当我合并时由于列表而出现问题。
    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 2016-09-07
    • 2021-11-20
    • 2021-11-27
    • 2022-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多