【问题标题】:R aggregate (key,value) data per rowR每行聚合(键,值)数据
【发布时间】:2013-06-23 09:01:46
【问题描述】:

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

 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 不同,在我的场景中,我必须分别聚合数据框的每一行。目前我只是逐行迭代,并为每一行使用“聚合”。有更聪明的方法吗?

【问题讨论】:

  • 您能否dput 提供您的数据样本。这不是一个措辞很明确的问题。
  • @AnandaMahto:添加了一个示例。谢谢你的建议

标签: r sorting dataframe aggregate


【解决方案1】:

这是一种解决方案,可以为您提供所需的值,尽管格式与您在示例输出中指定的格式略有不同:

  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)和键(key)的组合来计算总和。此外,根据原始 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
    

【讨论】:

  • 是的,尺寸应该是 val。这是一个错字。关于你的其余答案 - 我还在读它..
  • @zorbar,今天是星期天,我现在没有任何工作要做,所以我会很慷慨并给出完整的答案。
【解决方案2】:

为此,数据首先需要转换为“整洁”的格式。每个键和每个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2015-06-28
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多