按日期汇总数据并将不同的函数应用于相应的列?

时间:2013-05-13 16:54:09

标签: r sum aggregate average max

我有以下数据框“DF”,它是更大的数据框的一部分:

             X1  X2            X3 X4 X5
4468 2010-03-24   3  1.000000e+00  1  2
7662 2010-03-24   9  3.000000e+00  2  1
1272 2010-03-25   8  2.000000e+00  1  1
1273 2010-03-26   9  0.000000e+00  1  1
1274 2010-03-27   8  0.000000e+00  1  1
4469 2010-03-28   4  0.000000e+00  1  2
7663 2010-03-28   4  3.000000e+00  3  1
8734 2010-03-28   7  4.000000e+00  2  3
1275 2010-03-29   8  0.000000e+00  1  1

如您所见,第一列包含日期。我想做的是如下: 我想将此数据帧转换为新的“DF2”,其中每个日期只有1行,并且具有相应的列值:

X2, the average 
X3, the sum
X4, the maximum

每个日期的所有先前值。 X5不相关,可以删除。这将是结果:

             X1  X2            X3 X4
7662 2010-03-24   6  4.000000e+00  2  
1272 2010-03-25   8  2.000000e+00  1  
1273 2010-03-26   9  0.000000e+00  1  
1274 2010-03-27   8  0.000000e+00  1  
8734 2010-03-28   5  7.000000e+00  3  
1275 2010-03-29   8  0.000000e+00  1  

有谁知道如何做到这一点?非常感谢帮助!

4 个答案:

答案 0 :(得分:8)

DF <- read.table(text="             X1  X2            X3 X4 X5
4468 2010-03-24   3  1.000000e+00  1  2
7662 2010-03-24   9  3.000000e+00  2  1
1272 2010-03-25   8  2.000000e+00  1  1
1273 2010-03-26   9  0.000000e+00  1  1
1274 2010-03-27   8  0.000000e+00  1  1
4469 2010-03-28   4  0.000000e+00  1  2
7663 2010-03-28   4  3.000000e+00  3  1
8734 2010-03-28   7  4.000000e+00  2  3
1275 2010-03-29   8  0.000000e+00  1  1",header=TRUE)

library(data.table)

DT <- as.data.table(DF)

DT[,list(X2=mean(X2),X3=sum(X3),X4=max(X4)),by=X1]

#            X1 X2 X3 X4
# 1: 2010-03-24  6  4  2
# 2: 2010-03-25  8  2  1
# 3: 2010-03-26  9  0  1
# 4: 2010-03-27  8  0  1
# 5: 2010-03-28  5  7  3
# 6: 2010-03-29  8  0  1

答案 1 :(得分:5)

有很多方法可以做到这一点,但这里有一个sqldf解决方案:

library(sqldf)
sqldf("select X1, avg(X2), sum(X3), max(X4) from DF group by X1")

结果是:

          X1 avg(X2) sum(X3) max(X4)
1 2010-03-24       6       4       2
2 2010-03-25       8       2       1
3 2010-03-26       9       0       1
4 2010-03-27       8       0       1
5 2010-03-28       5       7       3
6 2010-03-29       8       0       1

答案 2 :(得分:4)

您可以使用plyr包中的ddply函数通过某些分组变量进行任意聚合或其他转换。

对于您的问题,代码看起来像:

library(plyr)
result <- ddply(DF, .(X1), function(df) {
  with(df, data.frame( X1=mean(X1), X2=sum(X2), X3=max(X3) ) )
} )

如果这是一个中型项目,那么您可能需要设置progress参数以显示进度条。对于一个非常大的问题,可以将其设置为使用并行处理。

答案 3 :(得分:1)

这是dplyr的方式:

library(dplyr)
DF %>%
   group_by(X1) %>%
   summarise(X2 = mean(X2), 
             X3 = sum(X3), 
             X4 = max(X4))

#  X1            X2    X3    X4
#  <fct>      <dbl> <dbl> <dbl>
#1 2010-03-24    6.    4.    2.
#2 2010-03-25    8.    2.    1.
#3 2010-03-26    9.    0.    1.
#4 2010-03-27    8.    0.    1.
#5 2010-03-28    5.    7.    3.
#6 2010-03-29    8.    0.    1.