R表格处理(dplyr)

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据