我是R的初学者。
我有这样的数据框架-
df <- data.frame(CustomerID = c(1, 1, 2, 2, 2, 3, 3)
, ProductPurchased = c('A', 'B', 'B', 'A', 'C', 'C', 'B')
, PurchaseNumber = c(1, 2, 1, 2, 3, 1, 2))
df
CustomerID ProductPurchased PurchaseNumber
1 A 1
1 B 2
2 B 1
2 A 2
2 C 3
3 C 1
3 B 2PurchaseNumber表示第一次购买。前-1表示第一次购买,2表示第二次购买等。
我想添加一个列,名为“FirstPurchase”,它将首次为该客户填充ProductPurchased
CustomerID ProductPurchased PurchaseNumber FirstPurchase
1 A 1 A
1 B 2 A
2 B 1 B
2 A 2 B
2 C 3 B
3 C 1 C
3 B 2 C作为下一步--我想看看是否可以读取MAX(PurchaseNumber),并在此基础上动态创建许多列,并且每一列都应该为该客户购买产品。
因为Max(PurchaseNumber)在这里是3。它应该创建3列(不担心将它们命名为第一、第二、第三列)如下-
CustomerID ProductPurchased PurchaseNumber FirstPurchase SecondPurchase ThirdPurchase
1 A 1 A B NA
1 B 2 A B NA
2 B 1 B A C
2 A 2 B A C
2 C 3 B A C
3 C 1 C B NA
3 B 2 C B NA我和data.table试过几件事-
dt <- data.table(df)
# this will give CustomerID and their first purchase
dt[PurchaseNumber == 1, 2, with = FALSE]但是如何将它们应用到其他列中呢?
任何帮助都是非常感谢的。甚至指点我应该研究的包也会很有帮助。
谢谢。
发布于 2015-11-27 17:10:42
我想你最好的选择是提尔
library(tidyr)
spread(df, PurchaseNumber, ProductPurchased)
# CustomerID 1 2 3
# 1 1 A B <NA>
# 2 2 B A C
# 3 3 C B <NA>发布于 2015-11-27 16:36:17
这是一口口香糖,但你可以尝试这样的东西:
library(splitstackshape)
DT <- as.data.table(df)
dcast(
getanID(
expandRows(DT[, count := max(PurchaseNumber), by = CustomerID], "count"),
c("CustomerID", "PurchaseNumber")),
CustomerID + .id ~ PurchaseNumber, value.var = "ProductPurchased")
# CustomerID .id 1 2 3
# 1: 1 1 A B NA
# 2: 1 2 A B NA
# 3: 2 1 B A C
# 4: 2 2 B A C
# 5: 2 3 B A C
# 6: 3 1 C B NA
# 7: 3 2 C B NA不过,这似乎是大量多余的数据。
所涉步骤:
expandRows来延长data.table。getanID创建按CustomerID和PurchaseNumber分组的新指示符变量。dcast扩展刚才创建的长data.table。https://stackoverflow.com/questions/33961113
复制相似问题