【发布时间】:2018-01-04 01:23:11
【问题描述】:
我的数据包含时间变量和选择的品牌变量,如下所示。 time表示购物时间,choicebrand表示当时购买的品牌。
有了这些数据,我想在下表中创建第三列和第四列。在此处创建列有一些规则。第三(第四)列表示品牌 1(品牌 2)基于 5 天内被选择的频率的排名。如果 5 天内没有历史记录,则应为 NA。
例如,让我们看看第 5 行。第 5 行的 shoptime 是 2013-09-05 09:11:00 然后 5 天窗口是 2013-08-31 09:11:00 ~ 2013-09-05 09:11:00。在这个时间段内,先后有brand3、bradn3、brand2、
和brand1(不包括第5行的chosenbrand)。 brand1(第三列)的排名,根据最常选择,排名第二,brand2 的排名也是第二。所以第 5 行的两列都应该是 2 和 2。
作为另一个例子,让我们看看下表中的最后一行。行的shoptime 是2013-09-09 09:32:00 然后5 天窗口是2013-09-04 09:32:00 ~ 2013-09-09 09:32:00。在这段时间内,有brand1、bradn2、brand6、brand2和brand2(不包括该行的chosenbrand)。 brand1(第三列)的排名,根据最常选择,排名第二,brand2 排名第一。所以行中的两列都应该是 2 和 1。
有什么简单的方法吗?
另外,如果我要个人做(如果每个客户都有多个购买历史),该怎么做?
数据如下,
shoptime chosenbrand nth_most_freq_brand1 nth_most_freq_brand2
2013-09-01 08:35:00 brand3 NA NA
2013-09-02 08:54:00 brand3 NA NA
2013-09-03 09:07:00 brand2 NA NA
2013-09-04 09:08:00 brand1 NA 2
2013-09-05 09:11:00 brand1 2 2
2013-09-06 09:14:00 brand2 1 2
2013-09-07 09:26:00 brand6 1 1
2013-09-08 09:26:00 brand2 1 2
2013-09-09 09:29:00 brand2 2 1
2013-09-09 09:32:00 brand4 2 1
这是数据代码
dat <- data.frame(shoptime = c("2013-09-01 08:35:00 UTC", "2013-09-02 08:54:00 UTC", "2013-09-03 09:07:00 UTC" ,"2013-09-04 09:08:00 UTC", "2013-09-05 09:11:00 UTC", "2013-09-06 09:14:00 UTC",
"2013-09-07 09:26:00 UTC", "2013-09-08 09:26:00 UTC" ,"2013-09-09 09:29:00 UTC", "2013-09-09 09:32:00 UTC"),
chosenbrand = c("brand3", "brand3", "brand2", "brand1", "brand1", "brand2", "brand6", "brand2" , "brand2" , "brand4" ),
nth_most_freq_brand1 = NA,
nth_most_freq_brand2 = NA,
stringsAsFactors = FALSE)
【问题讨论】:
-
我应该使用 for 循环吗?这将需要很长时间,因为我的数据量很大......有什么解决方案吗?
-
如果我理解正确,OP 提出了一个几乎相同的问题How to create a rank variable under certain conditions?。
-
@Johnlegend2 我已经更新了我的答案并重新发布了它。如果我之前在您的帖子中的编辑有任何不便,我深表歉意。显然,我之前以错误的方式解释了您的问题。将来,如果有人错误地解释了您的帖子,从而修改了您的帖子,与您的意图相冲突。您绝对有权对其进行编辑并澄清您的帖子。
标签: r dplyr data.table plyr sapply