运行 在数据框中的组内计数
Running Count within groups in a dataframe
我有一个在线购物平台的订单数据库。
我正在使用的 table 看起来像这样,其中每一行对应一个 customer/item/date。
OrderHistory <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"),
customer=c("A","A","A","B","B","B","B"),
item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee" ))
我想要得到的是每个成员订购特定商品的次数的 运行ning 计数,这样我就可以 运行 分析哪些商品被同一个人重复订购客户以及哪些客户只订购过一次就再也没有订购过。
输出看起来像
out <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"),
member=c("A","A","A","B","B","B","B"),
item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee" ),
count=c(1,1,2,1,2,3,1))
我喜欢 dplyr 解决方案,但我愿意接受任何建议!平台上的确切项目不断变化,因此解决方案必须是动态的才能解决这个问题。
我相信这应该能满足您的需求
library(dplyr)
OrderHistory %>%
group_by(customer, item) %>%
mutate(count = seq(n()))
Source: local data frame [7 x 4]
Groups: customer, item
date customer item count
1 2015-02-01 A Candy 1
2 2015-03-01 A Coffee 1
3 2015-04-01 A Coffee 2
4 2015-03-01 B Candy 1
5 2015-04-01 B Candy 2
6 2015-05-01 B Candy 3
7 2015-05-01 B Coffee 1
你已经得到了 "dplyr" 的答案,但是在 base R 中一个简单的方法是使用 ave
:
ave(rep(1, nrow(OrderHistory)), OrderHistory[-1], FUN = seq_along)
# [1] 1 1 2 1 2 3 1
您也可以使用我的 "splitstackshape" 包中的 getanID
:
library(splitstackshape)
getanID(OrderHistory, c("customer", "item"))
# date customer item .id
# 1: 2015-02-01 A Candy 1
# 2: 2015-03-01 A Coffee 1
# 3: 2015-04-01 A Coffee 2
# 4: 2015-03-01 B Candy 1
# 5: 2015-04-01 B Candy 2
# 6: 2015-05-01 B Candy 3
# 7: 2015-05-01 B Coffee 1
我有一个在线购物平台的订单数据库。
我正在使用的 table 看起来像这样,其中每一行对应一个 customer/item/date。
OrderHistory <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"),
customer=c("A","A","A","B","B","B","B"),
item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee" ))
我想要得到的是每个成员订购特定商品的次数的 运行ning 计数,这样我就可以 运行 分析哪些商品被同一个人重复订购客户以及哪些客户只订购过一次就再也没有订购过。
输出看起来像
out <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"),
member=c("A","A","A","B","B","B","B"),
item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee" ),
count=c(1,1,2,1,2,3,1))
我喜欢 dplyr 解决方案,但我愿意接受任何建议!平台上的确切项目不断变化,因此解决方案必须是动态的才能解决这个问题。
我相信这应该能满足您的需求
library(dplyr)
OrderHistory %>%
group_by(customer, item) %>%
mutate(count = seq(n()))
Source: local data frame [7 x 4]
Groups: customer, item
date customer item count
1 2015-02-01 A Candy 1
2 2015-03-01 A Coffee 1
3 2015-04-01 A Coffee 2
4 2015-03-01 B Candy 1
5 2015-04-01 B Candy 2
6 2015-05-01 B Candy 3
7 2015-05-01 B Coffee 1
你已经得到了 "dplyr" 的答案,但是在 base R 中一个简单的方法是使用 ave
:
ave(rep(1, nrow(OrderHistory)), OrderHistory[-1], FUN = seq_along)
# [1] 1 1 2 1 2 3 1
您也可以使用我的 "splitstackshape" 包中的 getanID
:
library(splitstackshape)
getanID(OrderHistory, c("customer", "item"))
# date customer item .id
# 1: 2015-02-01 A Candy 1
# 2: 2015-03-01 A Coffee 1
# 3: 2015-04-01 A Coffee 2
# 4: 2015-03-01 B Candy 1
# 5: 2015-04-01 B Candy 2
# 6: 2015-05-01 B Candy 3
# 7: 2015-05-01 B Coffee 1