smc*_*mci 4 performance r dataframe
你能让这个R代码更快吗?看不到如何矢量化它.我有一个数据框如下(下面的示例行):
> str(tt)
'data.frame': 1008142 obs. of 4 variables:
$ customer_id: int, visit_date : Date, format: "2010-04-04", ...
Run Code Online (Sandbox Code Playgroud)
我想为客户计算visit_dates之间的差异.所以我这样做diff(tt$visit_date),但必须强制执行一个不连续性(NA)到处都是customer_id更改而diff是没有意义的,例如下面的第74行.底部的代码执行此操作,但在1M行数据集上花费大于15分钟.我也尝试了分段计算和cbind'ing每个customer_id(使用which())的subresult ,这也很慢.有什么建议?谢谢.我搜索了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
Run Code Online (Sandbox Code Playgroud)
码:
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
}
Run Code Online (Sandbox Code Playgroud)
(想知道我们是否可以创建一个逻辑索引,其中customer_id与上面的行不同?)
设置NA到适当的位置,你再次可以使用diff()和单行技巧:
> tt$ivi[c(1,diff(tt$customer_id)) != 0] <- NA
Run Code Online (Sandbox Code Playgroud)
说明
让我们采取一些向量 x
x <- c(1,1,1,1,2,2,2,4,4,4,5,3,3,3)
Run Code Online (Sandbox Code Playgroud)
我们想要提取这些以新数字开头的索引,即(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
Run Code Online (Sandbox Code Playgroud)
并获取那些不等于零的索引:
x[y!=0] <- NA
Run Code Online (Sandbox Code Playgroud)