【发布时间】:2016-07-09 05:00:46
【问题描述】:
我正在尝试按组查找第一个/最后一个观察结果。我厌倦了 R 和 excel(因为它在 R 中很慢所以我尝试了 excel)。 excel 用了不到 1 秒,但 R 用了 8 分钟!!! >。两者的代码逻辑几乎相同。
数据是有关购买水果的面板数据。同一购物者可以在不同时间多次购买。 我有 233,000 次观察。 数据是这样的(按天购物者第一和天排序):
Day Shopper Choice
1 A apple
2 A apple
1 B Banana
1 C apple
2 C Banana
3 C apple
1 D berry
2 D berry
我的第一次观察的 r 代码。我想通过指标“1”标记组中的第一个观察,一个新列。
for (i in 1:n)
{ ifelse (dt$shopper[i+1]==dt$shopper[i],newcol[i+1]<-0,newcol[i+1]<-1)
}
我的excel代码是: if(B2B1,1,0)
我需要给定相同的购物者的回购矩阵。定义回购:“第一次购买”的回购是“第二次购买”;而“第2次购买”的回购是“第3次购买”最后一次购买没有回购。对不起,这听起来像一个扭曲。 所以我的解决方案是获得两个选择 col 并将第二个 col 移到上一行,这样我就可以通过购物者/或聚合计算回购矩阵。tagging 第一组 obs 的所需输出应如下所示。有了choice和choice 2的列,我可以通过nrow计算回购矩阵。
Day Shopper Choice tagging choice 2
1 A apple 0 *apple*
2 A apple *apple* 0
1 B Banana 0 0
1 C apple 0 Banana
2 C Banana Banana apple
3 C apple apple 0
1 D berry 0 *berry*
2 D berry *berry* 0
[更新]。如果该用户只购买了一次,则不会再购买。如果购买是用户最后一次购买,则不进行回购。所以在这种情况下最终选择的回购矩阵是
second inside bracket are the probability
first apple banana berry
apple 1 (0.5) 1 0
banana 1 0 (0) 0
berry 0 0 1 (1)
以下是我在标记用户首次购买后如何计算回购矩阵。 i 是行(苹果、香蕉、浆果等),j(苹果、香蕉、浆果等)是列。 [速度还可以,我在标记和添加辅助选择列后回购矩阵是40*40)
for (i in 1:n){
for(j in 1:n){
repurchase_matrix[i,j]=nrow(dt[dt[,1]==i&dt[,2]==j,])}}
【问题讨论】:
-
慢的不是 R。这是你的代码。
ifelse()是矢量化的。另外,我认为您甚至不能在ifelse()是/否参数中使用<-赋值。但更进一步,一旦你摆脱了for()循环,ifelse()也会相当慢。如果这是对大数据的分组操作,我会推荐 data.table 包以提高效率。 -
1-(B2=B1)应该比 if... 更快...仍然 Richard 是对的:您的代码执行方式需要很长时间... -
@RichardScriven。谢谢!我是 R.:( 我也尝试过 (if, else),仍然很慢。有什么建议可以让它更快吗?
-
您只想将每个组的第一行指示符设为 1,否则设为 0?请根据您的示例数据提供所需的输出。
-
@DirkReichel,谢谢。我对 excel 的速度非常满意,但还是谢谢你。我会试试的。即使我在 excel 中使用了 if,完成标记第一个/最后一个观察结果也需要不到一秒钟的时间。在这种情况下如何让我的 R 代码更快?