1

我已经阅读了许多主题,并且认为我的问题以前没有被问过。我data.frame在 R 中有一个与向客户展示的广告相关的内容:.. 我有很多客户,8 种不同的产品.. 所以这只是一个示例

mydf <- data.frame(Cust = c(1, 1), age = c(24, 24), 
    state = c("NJ", "NJ"), Product = c(1, 1), cost = c(400, 410), 
    Time = c(35, 25), Purchased = c("N", "Y"))
mydf
#   Cust age state Product cost Time Purchased
# 1    1  24    NJ       1  400   35         N
# 2    1  24    NJ       1  410   23         Y

我想把它改造成这样......

Cust | age | state | Product | cost.1 | time.1 | purch.1 | cost.2 | time.2 | purch.2
   1 |  24 |    NJ |       1 |    400 |     35 |       N |    410 |     23 |       Y

我怎样才能做到这一点?每个客户都有一些静态变量,例如年龄、状态和其他一些……然后是与呈现给给定客户的每个报价相关的详细信息、报价中的产品#、成本、时间,如果他们购买了它......我想把所有这些放在一条线上,让每个客户进行分析。

值得注意的是,产品的数量最多为 7 个,但对于某些客户来说,它的范围是 1 到 7 个。

我没有要真正展示的示例代码。我曾尝试使用该aggregate函数,但我不想聚合或做任何 SUM。我只是想做一些连接。研究表明cbind, 和tapply函数可能有用。

谢谢您的帮助。我对 R 很陌生。

4

1 回答 1

0

您本质上是要求对数据进行“长”到“宽”的重塑。

在我看来,您使用“Cust”、“age”、“state”和“Product”作为您的 ID 变量。但是,您没有实际的“时间”变量(“时间”,如上面提到的 ID 记录的顺序计数)。但是,这样的变量很容易创建:

mydf$timevar <- with(mydf, 
                     ave(rep(1, nrow(mydf)), 
                         Cust, age, state, Product, FUN = seq_along))
mydf
#   Cust age state Product cost Time Purchased timevar
# 1    1  24    NJ       1  400   35         N       1
# 2    1  24    NJ       1  410   23         Y       2

reshape从那里开始,这对于基础 R 中的函数非常简单。

reshape(mydf, direction = "wide", 
        idvar=c("Cust", "age", "state", "Product"),
        timevar = "timevar")
#   Cust age state Product cost.1 Time.1 Purchased.1 cost.2 Time.2 Purchased.2
# 1    1  24    NJ       1    400     35           N    410     23           Y
于 2014-03-30T05:22:07.763 回答