【发布时间】:2019-09-28 09:43:24
【问题描述】:
我需要处理包含数百万个条目的庞大数据集,格式如下:
表格:访问次数
|----------------|--------------|------------|
| PERSON_ID | DATE | #Clicks |
|----------------|--------------|------------|
| 1 | 2017-05-04 | 4 |
| 1 | 2018-05-04 | 1 |
| 1 | 2016-02-04 | 5 |
| 1 | 2018-05-06 | 7 |
| 2 | 2018-05-04 | 8 |
| 2 | 2018-05-16 | 1 |
| 2 | 2018-01-04 | 1 |
| 2 | 2018-02-04 | 2 |
| ... | ... | ... |
|----------------|--------------|------------|
我想统计每天的点击次数 + 之后的 30 天。
数据 N=2,000,000 人=15,000
遍历每个人大约需要 1 秒,这太慢了。 任何关于如何调整代码的建议都将不胜感激。
我已经尝试使用 apply/lapply,但没有取得巨大成功。
代码示例: 图书馆(润滑);
#Initial Data Set
visits <- data.frame(person_id=c(1,1,1,1,2,2,2,2),
date=c(ymd("2017-05-04"),ymd("2018-05-04"),ymd("2016-02-04"),ymd("2018-05-06"),ymd("2018-05-04"),ymd("2018-05-16"),ymd("2018-01-04"),ymd("2018-02-04")),
clicks=c(4,1,5,7,8,1,1,2),
clicks_30days=0)
unique_visitors <- unique(visits$person_id)
#For Each Person
for(person_id in unique_visitors)
{
#Subset person's records and order the, descending
person_visits <- visits[visits$person_id == person_id,]
person_visits <- person_visits[order(person_visits$date),]
#For each visit count the # of clicks of the visit + all visits within visit's date + 30 days
for(i in 1:nrow(person_visits))
{
search_interval <- interval( person_visits$date[i] , person_visits$date[i]+days(30))
#####This is the interesting codeline#####
calc_result <- sum(person_visits$clicks[person_visits$date %within% search_interval])**
##########################################
#save the clicks + 30 days
visits[rownames(person_visits)[i],"clicks_30days"] <- calc_result
}
}
真的非常感谢任何比这更快的东西。
【问题讨论】:
-
考虑使用
data.table包,看看是否能解决您的问题,对于这么小的数据集应该不会花很长时间
标签: r performance loops dataframe optimization