9

我有一个看起来像这样的数据框:

df<-data.frame(id=c("xx33","xx33","xx22","xx11","xx11","xx00"),amount=c(10,15,100,20,10,15),date=c("01/02/2013","01/02/2013","02/02/2013","03/03/2013","03/03/2013","04/04/2013"))

    id  amount  date
1   xx33    10  01/02/2013
2   xx33    15  01/02/2013
3   xx22    100 02/02/2013
4   xx11    20  03/03/2013
5   xx11    10  03/03/2013
6   xx00    15  04/04/2013

我想编译所有常见的 ID 并将数量和 id 的出现次数相加,但还要携带公共信息,例如每个 id 相同的日期(以及任何其他变量)。所以,我希望输出是:

    id  sum date        number
1   xx33    25  01/02/2013   2
2   xx22    100 02/02/2013   1
3   xx11    30  03/03/2013   2
4   xx00    15  04/04/2013   1

我试过了

ddply(.data = df, .var = "id", .fun = nrow)

并返回出现的总数,但我无法找到一种方法来总结所有常见的 id 而无需循环。

4

4 回答 4

9

使用data.table图书馆 -

library(data.table)
dt <- data.table(df)
dt2 <- dt[,list(sumamount = sum(amount), freq = .N), by = c("id","date")]

输出:

> dt2
     id       date sumamount freq
1: xx33 01/02/2013        25    2
2: xx22 02/02/2013       100    1
3: xx11 03/03/2013        30    2
4: xx00 04/04/2013        15    1
于 2013-10-25T18:11:10.783 回答
8

这是使用 plyr 包的解决方案:

   library(plyr)
ddply(df,.(date,id),summarize,sum=sum(amount),number=length(id))
            date   id sum number
    1 01/02/2013 xx33  25      2
    2 02/02/2013 xx22 100      1
    3 03/03/2013 xx11  30      2
    4 04/04/2013 xx00  15      1
于 2013-10-25T18:13:41.720 回答
5

这是一个 R 基础解决方案

> cbind(aggregate(amount~id+date, sum, data=df), table(df$id))[, -4]
    id       date amount Freq
1 xx33 01/02/2013     25    1
2 xx22 02/02/2013    100    2
3 xx11 03/03/2013     30    1
4 xx00 04/04/2013     15    2
于 2013-10-25T18:33:22.630 回答
3

一个强制性的基本 R 答案:

unique(transform(df, amount=ave(amount, id, FUN=sum), 
                     count=ave(amount, id, FUN=length)))
#     id amount       date count
# 1 xx33     25 01/02/2013     2
# 3 xx22    100 02/02/2013     1
# 4 xx11     30 03/03/2013     2
# 6 xx00     15 04/04/2013     1
于 2013-10-25T18:33:36.777 回答