2

我在 R 中有以下数据框,它为我提供了客户 1,2 和 3 的交易记录。每行显示交易的期间类型和他花费的金额。

id<-c(1,2,3,1,1,2,3,2,2)
period<-c("calib","valid","valid","calib","valid","valid","calib","calib","valid")
spent<-c(10,3,8,12,5,5,4,3,5)
df<-data.frame(id,period,spent)

现在我需要创建一个新的数据框,它为我提供不同“时期”中每个交易的每个“id”的平均“花费”。我在 excel 数据透视表中得到的结果表应如下所示:

id  calib    valid
1     11       5
2     3        4.33
3     4        8

我知道应该有一种方法可以在 R 中完成这项工作,但由于我是 R 的新手,所以我不知道。我想知道是否有人可以帮助我解决这个问题。

4

3 回答 3

3

您可以使用reshape2dcast包中的方法执行此操作(我敢肯定,还有许多其他方法):

library(reshape2)
dcast(df,id~period,fun.aggregate = mean)

  id calib    valid
1  1    11 5.000000
2  2     3 4.333333
3  3     4 8.000000

(请注意,我假设您打算将spent向量包含在数据框中。)

于 2012-07-22T03:22:09.560 回答
3

这是完整性的基本解决方案。

我编辑了你的代码,你忘了包含spent在你的 end data.frame 中。

df <- data.frame(id, period, spent)
with(df, tapply(spent, INDEX = list(id, period), FUN = mean))

  calib    valid
1    11 5.000000
2     3 4.333333
3     4 8.000000
于 2012-07-22T07:03:53.867 回答
2

并使用dplyrtidyr包:

df %>%
  group_by(id,period) %>%
  summarise (avg = mean(spent)) %>%
  spread(period,avg) # reshapes dataframe from long to wide
于 2015-02-06T16:29:09.530 回答