【问题标题】:Merging specific rows by summing certain columns on grouping variables通过对分组变量的某些列求和来合并特定行
【发布时间】:2021-02-23 13:13:00
【问题描述】:

以下数据框是更大 df 的子集,其中包含重复信息

df<-data.frame(Caught=c(92,134,92,134),
               Discarded=c(49,47,49,47),
               Units=c(170,170,220,220),
               Hours=c(72,72,72,72),
               Colour=c("red","red","red","red"))

Base R中,我想得到以下内容:

df_result<-data.frame(Caught=226,
                      Retained=96,
                      Units=390,
                      Hours=72,
                      colour="red")

因此,基本上结果是 Caught、Retained、Units 列的唯一值的总和,并为 Hours 和 color 保留相同的值(Caught=92+134,Retained=49+47,Units=170+220,Hours= 72,颜色=“红色)

但是,我打算在包含几列的更大的 data.frame 中执行此操作。我的想法是应用一个基于列名的函数:

l <- lapply(df, function(x) {
  if(names(x) %in% c("Caught","Discarded","Units"))
    sum(unique(x))
  else
    unique(x)
})
as.data.frame(l)

但是,这不起作用,因为我不完全确定在使用 lapply() 和诸如此类的其他函数时如何提取向量名称。

我尝试过没有成功实现by()apply() 函数。

谢谢

【问题讨论】:

    标签: r database aggregate database-management


    【解决方案1】:

    请求 Base R:

        l <- lapply( df, function(n) {
            if( is.numeric(n) )
                sum( unique(n) )
            else
                unique( n )
        })
        as.data.frame(l)
    

    此解决方案利用了 data.frames 实际上只是向量列表这一事实。

    它产生这个:

        #  Caught Discarded Units Hours Colour
        #    226        96   390    72    red
    

    【讨论】:

    • 非常感谢。我希望有一种不太自动化的方式来指定要汇总的列。我将如何指定要求和的列名称,而不是使用 as.numeric?
    • 查看 baroulotte 的回答,了解如何显式处理 data.frame 中的每个名称
    • 谢谢。我已经更新了问题,因为@barboulotte 的答案不是我想要的。
    【解决方案2】:

    一个命题:

    df <-data.frame(Caught=c(92,134,92,134),
                     Discarded=c(49,47,49,47),
                     Units=c(170,170,220,220),
                     Hours=c(72,72,72,72),
                     Colour=c("red","red","red","red"))
    
    df
    #>   Caught Discarded Units Hours Colour
    #> 1     92        49   170    72    red
    #> 2    134        47   170    72    red
    #> 3     92        49   220    72    red
    #> 4    134        47   220    72    red
    
    
    df_results <- data.frame(Caught = sum(unique(df$Caught)),
                             Discarded = sum(unique(df$Discarded)),
                             Units = sum(unique(df$Units)),
                             Hours = unique(df$Hours),
                             Colour = unique(df$Colour))
    
    df_results
    #>   Caught Discarded Units Hours Colour
    #> 1    226        96   390    72    red
    
    # Created on 2021-02-23 by the reprex package (v0.3.0.9001)
    

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多