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

时间:2011-10-31 07:00:03

标签: performance r dataframe

你能更快地制作这个R代码吗?看不到如何矢量化它。 我有一个数据框如下(下面的示例行):

> str(tt)
'data.frame':   1008142 obs. of  4 variables:
 $ customer_id: int, visit_date : Date, format: "2010-04-04", ...

我想为客户计算visit_dates之间的差异。 所以我做diff(tt$visit_date),但是必须强制执行不连续性(NA)到处的customer_id更改并且差异无意义,例如第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与上面的行不同?)

1 个答案:

答案 0 :(得分:6)

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