当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 如何更快地计算/插入日期差异列?

来源:互联网 收集:自由互联 发布时间:2021-06-22
你能让这个R代码更快吗?看不到如何矢量化它. 我有一个数据框如下(下面的示例行): str(tt)'data.frame': 1008142 obs. of 4 variables: $customer_id: int, visit_date : Date, format: "2010-04-04", ... 我想为客户
你能让这个R代码更快吗?看不到如何矢量化它.
我有一个数据框如下(下面的示例行):

> 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
网友评论