我有以下数据框“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
有谁知道如何做到这一点?非常感谢帮助!
答案 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.