在R中的数据框内合并和追加行

时间:2014-03-29 23:24:43

标签: r aggregate reshape tapply cbind

我已阅读了许多主题,并且认为之前没有问过我的问题。我在R中有data.frame与向客户展示的广告相关:..我有很多客户,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。我只想做一些加入。研究表明,cbindtapply函数可能很有用。

感谢您的帮助。我是R.的新手。

1 个答案:

答案 0 :(得分:0)

你基本上要求做一个&#34; long&#34;到&#34;宽&#34;重塑您的数据。

在我看来,你喜欢使用&#34; Cust&#34;,&#34; age&#34;,&#34; state&#34;,&#34;&#34; Product&#34;作为你的ID变量。你没有真正的&#34;时间&#34;变量虽然(&#34;时间&#34;如在上面提到的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

从那里开始,使用基础R中的reshape函数非常简单。

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