在数据框R中动态创建列,并根据其他列条件填充

时间:2015-11-27 16:05:01

标签: r dataframe data.table

我是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次购买。 Ex - 1表示首次购买,2表示第二次购买等。

我想添加一栏说“FirstPurchase&#39;这将为该客户首次填充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)并基于此 动态创建那些列,每列应该有为此购买的产品 客户。
Ex - 因为这里的Max(PurchaseNumber)是3.它应该创建3列(不担心将它们命名为First,Second,Third)这样 -

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]

但是如何将它们应用到其他列?

感谢任何帮助。即使指针我应该查看哪些包也会非常有帮助。

谢谢。

2 个答案:

答案 0 :(得分:2)

这是满口的,但你可以尝试类似的东西:

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

但这似乎是很多冗余数据。

涉及的步骤:

  1. 添加一个列表示CustomerID的最大计数。
  2. 使用我的&#34; splitstackshape&#34;中的expandRows打包以延长data.table
  3. 使用getanID创建按CustomerID和PurchaseNumber分组的新指标变量。
  4. 使用dcast加宽您刚创建的长data.table

答案 1 :(得分:0)

我认为你最好的选择是tidyr

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>