R表格处理(dplyr)
源文件是一个excel表格,主要的需求是按照日期分组,然后再按照另一列分组,同时求和和计算均值。大致的内容类似:
日期,用户,收入
2015-12-01 8:00:00,u1,2
2015-12-01 8:00:00,u1,4
2015-12-01 10:00:00,u2,5
2015-12-02 9:00:00,u1,10
2015-12-02 10:00:00,u2,4
统计内容是每天用户的数量、收入总数和平均每个用户的收入。例如:
日期,用户数,总收入,平均收入
2015-12-01,2,11,5.5
R中应该有多种方式能够实现这种数据聚合。网上很多都推荐使用dplyr包来进行运算。
首先是安装,和R其他包安装方式相同:
install.packages("dplyr")
然后是引入dplyr包,并加载入源输入(元数据是从excel导出的csv数据)。
library("dplyr")
data <- read.csv('input.csv')
这时的data变量内容为:
> data
日期 用户 收入
1 2015-12-01 8:00:00 u1 2
2 2015-12-01 8:00:00 u1 4
3 2015-12-01 10:00:00 u2 5
4 2015-12-02 9:00:00 u1 10
5 2015-12-02 10:00:00 u2 4
由于输出是按照日统计的,所以将第一列中的时间转成日期,以方便后续的聚合。
data$日期 = as.Date(data$日期)
修改之后会变成:
> data
日期 用户 收入
1 2015-12-01 u1 2
2 2015-12-01 u1 4
3 2015-12-01 u2 5
4 2015-12-02 u1 10
5 2015-12-02 u2 4
然后开始聚合,这里的聚合有两个未读,首先是日期,然后是用户。
d_u_group <- group_by(data, 日期, 用户)
通过summarise函数,可以计算聚合之后的值:
d_u <- summarise(d_u_group, 'c' = n(), sum(收入))
由于这时的聚合是两个纬度的,所以还不是最终的数据:
> d_u
Source: local data frame [4 x 4]
Groups: 日期 [?]
日期 用户 c sum(收入)
(date) (fctr) (int) (int)
1 2015-12-01 u1 2 6
2 2015-12-01 u2 1 5
3 2015-12-02 u1 1 10
4 2015-12-02 u2 1 4
最后再按照日期做聚合:
d_group <- group_by(d_u, 日期)
d <- summarise(d_group, '用户数' = n(), '总收入' = sum(收入), '平均收入' = 总收入/用户数)
最终的数据结果为:
> d
Source: local data frame [2 x 4]
日期 用户数 总收入 平均收入
(date) (int) (int) (dbl)
1 2015-12-01 2 11 5.5
2 2015-12-02 2 14 7.0