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

Performance 如何更快地计算/插入日期差列?,performance,r,dataframe,Performance,R,Dataframe,你能让这个R码更快吗?看不到如何将其矢量化。 我有一个如下的数据框(下面的示例行): 我想计算客户访问日期之间的差异。 因此,我确实执行了diff(tt$visit\u date),但必须在客户id发生变化且差异无意义的地方强制执行不连续性(NA),例如下面第74行。 底部的代码执行此操作,但在1M行数据集上花费的时间大于15分钟。 我还尝试了分段计算和按客户id查找子结果(使用which()),这也很慢。 有什么建议吗?谢谢我确实搜索过,R-intro,R手册页,等等 customer_

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

我想计算客户访问日期之间的差异。 因此,我确实执行了
diff(tt$visit\u date)
,但必须在客户id发生变化且差异无意义的地方强制执行不连续性(
NA
),例如下面第74行。 底部的代码执行此操作,但在1M行数据集上花费的时间大于15分钟。 我还尝试了分段计算和按客户id查找子结果(使用
which()
),这也很慢。 有什么建议吗?谢谢我确实搜索过,R-intro,R手册页,等等

   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要将
NA
设置到适当的位置,您可以再次使用
diff()
和单行技巧:

> tt$ivi[c(1,diff(tt$customer_id)) != 0] <- NA
我们希望提取这样的索引,它们以新的数字开始,即(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

y太棒了!你的意思是
tt$ivi[c(1,diff(tt$customer\u id))!=0]当然我明白了,我只是不明白为什么这应该比顺序存取快1000倍。在R中,只要你能摆脱循环,就去做。R是非常向量化的,你应该用向量在R中编码,而不是用单独的数字进行迭代。@smci,关于为什么R循环比向量化慢,在SO中有几个讨论。例如,看看@smci,代码中的瓶颈是使用

> tt$ivi[c(1,diff(tt$customer_id)) != 0] <- NA
x <- c(1,1,1,1,2,2,2,4,4,4,5,3,3,3)
y <- c(1,diff(x))
# y = 1  0  0  0  1  0  0  2  0  0  1 -2  0  0
x[y!=0] <- NA