我是 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 2
PurchaseNumber表示第n次购买。例如 - 1 表示第一次购买,2 表示第二次购买等等。
我想添加一个名为“FirstPurchase”的列,以填充该客户首次购买的产品
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]
但是我如何将它们应用到其余的列呢?
感谢任何帮助。甚至指示我应该查看什么包也会非常有帮助。
谢谢。
最佳答案
这是一口,但你可以尝试这样的事情:
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
虽然这似乎是很多冗余数据。
涉及的步骤:
- 添加一列,按 CustomerID 指示最大计数。
- 使用我的“splitstackshape”包中的
expandRows
来延长您的data.table
。 - 使用
getanID
创建一个按 CustomerID 和 PurchaseNumber 分组的新指标变量。 - 使用
dcast
加宽您刚刚创建的长data.table
。
关于r - 在数据框 R 中动态创建列并根据其他列条件进行填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33961113/