R每行的聚合(键,值)数据

时间:2013-06-23 09:01:47

标签: r sorting dataframe aggregate

我正在尝试创建(键,值)对的聚合列表:

 d <- data.frame(key.1 = c(1,1),
                 val.1  = c(100,100),
                 key.2 = c(1,1),
                 val.2  = c(100,100),
                 key.3 = c(2,3),
                 val.3 = c(100,100))

key.1 val.1 key.2 val.2 key.3 val.3
    1   100     1   100     2   100
    1   100     1   100     3   100

我希望结果是:

key.1 val.1 key.2 val.2
    1   200     2   100
    1   200     3   100

意味着(1,100)和(1,100)基于公共1聚合,并且它们的值总计为200.第一行的(2,100)和第二行的(3,100)保持原样,因为没有另一对的共同密钥。

this question不同,在我的方案中,我必须单独汇总数据框的每一行。目前我只是逐行迭代,并使用“aggregate”对每一行进行迭代。有更聪明的方法吗?

2 个答案:

答案 0 :(得分:2)

这是一个可以获取您正在寻找的值的解决方案,虽然格式与您在示例输出中指定的格式略有不同:

  1. 根据rownames创建“ID”,因为您希望最后按行汇总...

    d$ID <- rownames(d)
    
  2. 使用reshape

    将数据从“宽”格式转换为“长格式”
    temp <- reshape(d, direction = "long", idvar="ID", 
                    varying = setdiff(names(d), "ID"))
    
    temp
    #     ID time key val
    # 1.1  1    1   1 100
    # 2.1  2    1   1 100
    # 1.2  1    2   1 100
    # 2.2  2    2   1 100
    # 1.3  1    3   2 100
    # 2.3  2    3   3 100
    
  3. 使用aggregate通过行(ID)和键(键)的组合计算总和。另外,根据原始ID的“组”创建第二个“ID”。

    temp1 <- aggregate(val ~ ID + key, temp, sum)
    temp1 <- within(temp1, {
      ID2 <- ave(ID, ID, FUN = seq_along)
    })
    temp1
    #   ID key val ID2
    # 1  1   1 200   1
    # 2  2   1 200   1
    # 3  1   2 100   2
    # 4  2   3 100   2
    
  4. 再次使用reshape返回“广”形式:

    reshape(temp1, direction = "wide", idvar="ID", timevar="ID2")
    #   ID key.1 val.1 key.2 val.2
    # 1  1     1   200     2   100
    # 2  2     1   200     3   100
    

答案 1 :(得分:0)

为此,数据首先需要转换为“整洁”格式。每个键和每个val实际上是相同的变量,并且您希望按键和另一个未明确编码的变量列进行聚合。数据应按如下方式排列:

d <- data.frame(key = c(1,1,1,1,2,3), 
             val = c(100,100,100,100,100,100), 
             keycol = c(1,1,2,2,3,3))

哪个给出了

  key val  keycol
#   1 100       1
#   1 100       1
#   1 100       2
#   1 100       2
#   2 100       3
#   3 100       3

现在只需按keykeycol汇总即可获得所需的结果。我喜欢dplyr

library(dplyr)
d %>% group_by(key, keycol) %>% summarise(sum(val))

这会以正确的形式提供您想要的结果。

     key  keycol sum(val)
   (dbl)   (dbl)    (dbl)
#1     1       1      200
#2     1       2      200
#3     2       3      100
#4     3       3      100