在R中聚合数据

时间:2015-06-22 09:56:50

标签: r

user_id date        datetime  page
217568  6/12/2015   49:23.9   Vodafone | How to get in touch with Vodafone
135437  6/10/2015   43:35.7   My Vodafone – Manage your Vodafone Pay Monthly Account Online – Vodafone
196094  6/13/2015   33:39.4   Check the status of Vodafone’s mobile network in real-time
74197   6/6/2015    52:46.1   undefined
153501  6/5/2015    02:55.5   Device Details
71459   6/4/2015    54:05.5 
90906   6/9/2015    35:41.7   Vodafone | Mobile Phones
30886   6/9/2015    15:59.8   Vodafone | Mobile Phones
217568  6/9/2015    10:52.9   Vodafone | Mobile Phones
137324  6/16/2015   40:51.7   Vodafone | How to get in touch with Vodafone

这是我拥有的前10行样本数据,我需要聚合&#34; page&#34;关于date和user_id的列(这是一个唯一的标识符),基本上我想安排这个数据,因为在特定的(user_ID)我需要他访问的所有页面,在一行中的特定日期之间由&#34; _&#34; 。 我尝试使用这个:tabel <- dt[,.SD[,paste(page, sep=",", collapse="_")], by=date] dt是我的数据框,但是这给了我特定日期访问过的网页,但我希望在(user_id)级别。我如何使用R?

实现这一目标

结果表看起来应该是这样的。(例子)

row.names   date        pages
217568     2015-06-12   page1,page2
217568     2015-06-13   page3,page5

page1,page2,page3,page5是来自列&#34;页面&#34;

的页面

2 个答案:

答案 0 :(得分:2)

你可以使用stats包中的聚合函数,尝试这样的事情:

aggregate(dt$page, list(dt$user_id, dt$date), FUN=paste, collapse=", ")

请注意日期,如果将它们存储为POSIXlt,强制因素可能会有问题,如果日期存储为POSIXct或字符串,则应该没问题。

答案 1 :(得分:1)

使用data.table

 library(data.table)
 setDT(df1)[, list(pages=paste(page, collapse="_")),
          list(user_id, date=as.Date(date, '%m/%d/%Y'))]

或使用dplyr

 library(dplyr)
 df1 %>% 
     group_by(user_id, date=as.Date(date, '%m/%d/%Y')) %>%
     summarise(pages=paste(page, collapse='_'))