【问题标题】:R: Aggregating data by column group - mutate column with values for each observationR:按列组聚合数据 - 使用每个观察值改变列
【发布时间】:2016-10-23 22:17:53
【问题描述】:

我遇到了一个初学者的问题,它为一个数据类别聚合数据,创建一个新列,其中包含每个观察项的每个类别数据的总和。

我想要以下数据:

PIN Balance
221 5000
221 2000
221 1000
554 4000
554 4500
643 6000
643 4000

看起来像:

PIN Balance Total
221 5000 8000
221 2000 8000
221 1000 8000
554 4000 8500
554 4500 8500
643 6000 10000
643 4000 10000

我尝试使用聚合:输出

【问题讨论】:

  • 你尝试过什么吗?
  • 第二列第三行输入输出不一样

标签: r aggregate


【解决方案1】:

您可以使用dplyr 做您想做的事。我们首先group_byPIN,然后使用mutate创建一个新列Total,这是分组Balance的总和:

library(dplyr)
res <- df %>% group_by(PIN) %>% mutate(Total=sum(Balance))

将您的数据用作数据框df

df <- structure(list(PIN = c(221L, 221L, 221L, 554L, 554L, 643L, 643L
), Balance = c(5000L, 2000L, 1000L, 4000L, 4500L, 6000L, 4000L
)), .Names = c("PIN", "Balance"), class = "data.frame", row.names = c(NA, 
-7L))
##  PIN Balance
##1 221    5000
##2 221    2000
##3 221    1000
##4 554    4000
##5 554    4500
##6 643    6000
##7 643    4000

我们得到了预期的结果:

print(res)
##Source: local data frame [7 x 3]
##Groups: PIN [3]
##
##    PIN Balance Total
##  <int>   <int> <int>
##1   221    5000  8000
##2   221    2000  8000
##3   221    1000  8000
##4   554    4000  8500
##5   554    4500  8500
##6   643    6000 10000
##7   643    4000 10000

或者我们可以使用data.table:

library(data.table)
setDT(df)[,Table:=sum(Balance),by=PIN][]
##    PIN Balance Total
##1:  221    5000  8000
##2:  221    2000  8000
##3:  221    1000  8000
##4:  554    4000  8500
##5:  554    4500  8500
##6:  643    6000 10000
##7:  643    4000 10000

【讨论】:

    【解决方案2】:

    考虑使用sapply() 条件和方法的基本 R 解决方案:

    df <- read.table(text="PIN Balance
                     221 5000
                     221 2000
                     221 1000
                     554 4000
                     554 4500
                     643 6000
                     643 4000", header=TRUE)    
    
    df$Total <- sapply(seq(nrow(df)), function(i){
      sum(df[df$PIN == df$PIN[i], c("Balance")])
    }) 
    
    #   PIN Balance Total
    # 1 221    5000  8000
    # 2 221    2000  8000
    # 3 221    1000  8000
    # 4 554    4000  8500
    # 5 554    4500  8500
    # 6 643    6000 10000
    # 7 643    4000 10000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多