你能更快地制作这个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与上面的行不同?)
答案 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