r - 在数据框 R 中动态创建列并根据其他列条件进行填充

标签 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次购买。例如 - 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

虽然这似乎是很多冗余数据。


涉及的步骤:

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

关于r - 在数据框 R 中动态创建列并根据其他列条件进行填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33961113/

相关文章:

python - 有没有一种简单的方法可以从另一个 df 中的一个数据帧中搜索字符串并返回关联值?

R v3.4.0-2 在 Arch 上无法找到 libgfortran.so.3

r - 使用 dplyr - R 检查组中的字符是否全部相等

java - 在java中读取.csv文件: missing few rows

python - Pandas DataFrame 按列值组合行,其中行可以有 NaN

r - 如何按组(ID)复制最后一行?

r - 获取data.table中上一组的最后一行

R随机化和随机化数据表的列

r - 如何消除矩阵中符合某些条件的行?在R中

r - 如何动态指定 row_spec kable() 中的最后一行号?