你能让这个R代码更快吗?看不到如何矢量化它. 我有一个数据框如下(下面的示例行): str(tt)'data.frame': 1008142 obs. of 4 variables: $customer_id: int, visit_date : Date, format: "2010-04-04", ... 我想为客户
我有一个数据框如下(下面的示例行):
> str(tt) 'data.frame': 1008142 obs. of 4 variables: $customer_id: int, visit_date : Date, format: "2010-04-04", ...
我想为客户计算visit_dates之间的差异.
所以我做差异(tt $visit_date),但是必须强制执行一个不连续性(NA)到处都是customer_id改变而diff是没有意义的,例如第74行.
底部的代码执行此操作,但在1M行数据集上花费大约15分钟.
我还尝试了分段计算和cbind’ing每个customer_id的subresult(使用which()),这也很慢.
有什么建议?谢谢.我搜索了SO,R-intro,R manpages等.
customer_id visit_date visit_spend ivi 72 40 2011-03-15 18.38 5 73 40 2011-03-20 23.45 5 74 79 2010-04-07 150.87 NA 75 79 2010-04-17 101.90 10 76 79 2010-05-02 111.90 15
码:
all_tt_cids <- unique(tt$customer_id) # Append ivi (Intervisit interval) column tt$ivi <- c(NA,diff(tt$visit_date)) for (cid in all_tt_cids) { # ivi has a discontinuity when customer_id changes tt$ivi[min(which(tt$customer_id==cid))] <- NA }
(想知道我们是否可以创建一个逻辑索引,其中customer_id与上面的行不同?)
要将NA设置为适当的位置,您可以再次使用diff()和单行技巧:> tt$ivi[c(1,diff(tt$customer_id)) != 0] <- NA
说明
我们来看一些向量x
x <- c(1,1,1,1,2,2,2,4,4,4,5,3,3,3)
我们想要提取以新数字开头的索引,即(0,5,8,11,12).我们可以使用diff().
y <- c(1,diff(x)) # y = 1 0 0 0 1 0 0 2 0 0 1 -2 0 0
并获取那些不等于零的索引:
x[y!=0] <- NA