【问题标题】:Long Format Function [duplicate]长格式函数[重复]
【发布时间】:2012-11-02 11:24:29
【问题描述】:

可能重复:
faster way to create variable that aggregates a column by id

我在一个项目上遇到问题。我创建了一个长格式的数据框(称为 dat)(我复制了下面的前 3 行),我想计算例如 2000 年至 2011 年美国所有银行的税前收入的平均值。我将如何去做?我在 R 方面几乎没有任何经验。如果答案太明显,我很抱歉,但我找不到任何东西,而且我已经在这个项目上花了很多时间。先感谢您!

KeyItem     Bank    Country Year    Value  
1   Pretax Income   WELLS_FARGO_&_COMPANY   UNITED STATES   2011    2.365600e+10                            
2   Total Assets    WELLS_FARGO_&_COMPANY   UNITED STATES   2011    1.313867e+12                            
3   Total Liabilities   WELLS_FARGO_&_COMPANY   UNITED STATES 2011  1.172180e+12                            

【问题讨论】:

  • 欢迎来到SO,这个问题已经被问过很多次了。以stackoverflow.com/questions/8225621/… 为例
  • 欢迎来到 SO。 @mnel 是正确的——关于聚合的问题在这里被问过很多次。对于您的问题,您必须对数据进行聚合和子集化。您可以先聚合,然后再进行子集,或者,如果您的数据集非常大,则先进行子集,然后再聚合(这是我在回答中所展示的,但并没有太多让您通过实验学习的乐趣)。此外,作为您的必读,这里的大多数用户通常对reproducible examples 的响应更快。

标签: r dataframe aggregate


【解决方案1】:

以下内容应该可以帮助您入门。您基本上需要做两件事:子集和聚合。我将演示一个基本 R 解决方案和一个 data.table 解决方案。

首先,一些示例数据。

set.seed(1) # So you can reproduce my results
dat <- data.frame(KeyItem = rep(c("Pretax", "TotalAssets", "TotalLiabilities"), 
                                times = 30),
                  Bank = rep(c("WellsFargo", "BankOfAmerica", "ICICI"), 
                             each = 30),
                  Country = rep(c("UnitedStates", "India"), times = c(60, 30)),
                  Year = rep(c(2000:2009), each = 3, times = 3),
                  Value = runif(90, min=300, max=600))

让我们按“国家”和“年份”汇总“税前”值的平均值,但仅限于 2001 年到 2005 年。

aggregate(Value ~ Country + Year, 
          dat[dat$KeyItem == "Pretax" & dat$Year >= 2001 & dat$Year <=2005, ], 
          mean)
#         Country Year    Value
# 1         India 2001 399.7184
# 2  UnitedStates 2001 464.1638
# 3         India 2002 443.5636
# 4  UnitedStates 2002 560.8373
# 5         India 2003 562.5964
# 6  UnitedStates 2003 370.9591
# 7         India 2004 404.0050
# 8  UnitedStates 2004 520.4933
# 9         India 2005 567.6595
# 10 UnitedStates 2005 493.0583

data.table 也有同样的内容

library(data.table)
DT <- data.table(dat, key = "Country,Bank,Year")
subset(DT, KeyItem == "Pretax")[Year %between% c(2001, 2005), 
    mean(Value), by = list(Country, Year)]
#          Country Year       V1
#  1:        India 2001 399.7184
#  2:        India 2002 443.5636
#  3:        India 2003 562.5964
#  4:        India 2004 404.0050
#  5:        India 2005 567.6595
#  6: UnitedStates 2001 464.1638
#  7: UnitedStates 2002 560.8373
#  8: UnitedStates 2003 370.9591
#  9: UnitedStates 2004 520.4933
# 10: UnitedStates 2005 493.0583

【讨论】:

  • 当然,您也可以进行类似的子集设置以仅获取美国的银行。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2020-05-18
  • 2021-09-15
  • 2020-07-23
  • 2020-10-23
相关资源
最近更新 更多