【问题标题】:Create columns dynamically in data frame R and populate based on other column condition在数据框 R 中动态创建列并根据其他列条件填充
【发布时间】:2015-11-27 16:05:01
【问题描述】:

我是 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”的列,它将为该客户首次填充 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]

但是如何将它们应用于其余列?

感谢任何帮助。即使是我应该研究什么包的指针也会非常有帮助。

谢谢。

【问题讨论】:

  • A B C 指的是什么?
  • 看来你可以merge "df" 和reshape(df, direction = "wide", idvar = "CustomerID", timevar = "PurchaseNumber") by "CustomerID"。

标签: r dataframe data.table


【解决方案1】:

这是一口,但您可以尝试以下方法:

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

【讨论】:

  • 这太棒了。谢谢阿南达·马赫托。但是,正如您已经提到的那样,会创建大量冗余数据。让我看看是否有减少冗余的好方法。但是非常感谢您的代码。
  • 我赞成你的回答,因为它有很多有价值的信息。它确实解决了我问的问题。但是,由于我打算使用 heathobrien 的回答,所以我接受了他的回答。
【解决方案2】:

我认为你最好的选择是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>

【讨论】:

  • 这很酷。我可以传播它,然后 left_join 以获得所需的结果。谢谢@heathobrien。感谢您的代码。
猜你喜欢
  • 1970-01-01
  • 2017-12-26
  • 2023-03-27
  • 2021-12-10
  • 1970-01-01
  • 2017-07-04
  • 2020-09-14
  • 2020-10-03
  • 2022-10-07
相关资源
最近更新 更多