首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数据帧R中动态创建列,并根据其他列条件进行填充

在数据帧R中动态创建列,并根据其他列条件进行填充
EN

Stack Overflow用户
提问于 2015-11-27 16:05:01
回答 2查看 206关注 0票数 3

我是R的初学者。

我有这样的数据框架-

代码语言:javascript
运行
复制
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表示第一次购买。前-1表示第一次购买,2表示第二次购买等。

我想添加一个列,名为“FirstPurchase”,它将首次为该客户填充ProductPurchased

代码语言:javascript
运行
复制
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列(不担心将它们命名为第一、第二、第三列)如下-

代码语言:javascript
运行
复制
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试过几件事-

代码语言:javascript
运行
复制
dt <- data.table(df)

# this will give CustomerID and their first purchase
dt[PurchaseNumber == 1, 2, with = FALSE]

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

任何帮助都是非常感谢的。甚至指点我应该研究的包也会很有帮助。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-27 17:10:42

我想你最好的选择是提尔

代码语言:javascript
运行
复制
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>
票数 0
EN

Stack Overflow用户

发布于 2015-11-27 16:36:17

这是一口口香糖,但你可以尝试这样的东西:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33961113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档