【问题标题】:R - Aggregate function creating sub-listsR - 创建子列表的聚合函数
【发布时间】:2017-11-29 00:16:01
【问题描述】:

我正在使用聚合函数来汇总一些数据。数据是贷款数据,我有 ContractNum 和 LoanAmount。我想按 StartDate 聚合数据,计算贷款数量和平均贷款金额。
这是我使用的数据和函数的示例:

ContractNum <- c("RHL-1","RHL-2","RHL-3","RHL-3")
StartDate <- c("2016-11-01","2016-11-01","2016-12-01","2016-12-01")
LoanPurpose <- c("Personal","Personal","HomeLoan","Investment")
LoanAmount <- c(200,500,600,150)

dat <- data.frame(ContractNum,StartDate,LoanPurpose,LoanAmount)



 aggr.data <- aggregate(
  cbind(LoanAmount,ContractNum) ~ StartDate + LoanPurpose  
  ,data = dat
  ,FUN = function(x)c(count = mean(x),length(x))
)

当我查看聚合函数的结果时,它看起来还可以:

> aggr.data
   StartDate LoanPurpose LoanAmount.count LoanAmount.V2 ContractNum.count ContractNum.V2
1 2016-12-01    HomeLoan              600             1               3.0            1.0
2 2016-12-01  Investment              150             1               3.0            1.0
3 2016-11-01    Personal              350             2               1.5            2.0

但是当我查看它的结构时,它似乎创建了一个子列表:

> str(aggr.data)
'data.frame':   3 obs. of  4 variables:
 $ StartDate  : Factor w/ 2 levels "2016-11-01","2016-12-01": 2 2 1
 $ LoanPurpose: Factor w/ 3 levels "HomeLoan","Investment",..: 1 2 3
 $ LoanAmount : num [1:3, 1:2] 600 150 350 1 1 2
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "count" ""
 $ ContractNum: num [1:3, 1:2] 3 3 1.5 1 1 2
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "count" ""

如何摆脱这个子列表,以便我可以像通常访问 DF 一样访问每一列?我知道在代码中我要求给我一个没有意义的 ContractNum 的平均值,但我可以摆脱那一列。

谢谢

【问题讨论】:

  • 为什么这被否决了?
  • 您的示例代码可能不起作用?在制作aggr.data 时,您有一个额外的)。 (顺便说一句,我不是反对者)。

标签: r dataframe aggregate


【解决方案1】:

只需在aggr.data 上执行do.call(data.frame, ...) 即可取消嵌套矩阵。

aggr.data <- do.call(data.frame, aggr.data);
str(aggr.data);
#'data.frame':  3 obs. of  6 variables:
# $ StartDate        : Factor w/ 2 levels "2016-11-01","2016-12-01": 2 2 1
# $ LoanPurpose      : Factor w/ 3 levels "HomeLoan","Investment",..: 1 2 3
# $ LoanAmount.count : num  600 150 350
# $ LoanAmount.V2    : num  1 1 2
# $ ContractNum.count: num  3 3 1.5
# $ ContractNum.V2   : num  1 1 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2011-09-05
    • 2021-12-26
    • 2022-01-12
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多