为每个类和每个ID聚合一个变量的值

Ali*_*vil 2 r aggregation

我有以下数据框:

id <- c(1,1,1,1,1,2,2,2,2)
spent <- c(10,10,20,10,10,5,5,5,20)
period <- c("f","c","c","v","v","f","c","c","v")
mean.spent <- c(10,15,15,10,10,5,5,5,20)
df <- data.frame(id,spent,period,mean.spent)
Run Code Online (Sandbox Code Playgroud)

我想要的是汇总每个时期每个Id的平均花费如下:

id  f  c  v    
1   10 15 10
2   5  5  20
Run Code Online (Sandbox Code Playgroud)

你能帮我做一下吗?

A5C*_*2T1 6

使用xtabs()沿aggregate()如下:

df <- data.frame(id = c(1,1,1,1,1,2,2,2,2),
                 spent = c(10,10,20,10,10,5,5,5,20),
                 period = c("f","c","c","v","v","f","c","c","v"),
                 mean.spent = c(10,15,15,10,10,5,5,5,20))

xtabs(spent ~ id + period, aggregate(spent ~ id + period, df, mean))
#    period
# id   c  f  v
#   1 15 10 10
#   2  5  5 20
Run Code Online (Sandbox Code Playgroud)

aggregate计算每组的平均值(按"id"和"period"分组),并xtabs转换为更宽的格式.

以下是如何将其变为data.frame:

temp1 <- xtabs(spent ~ id + period, 
               aggregate(spent ~ id + period, df, mean))
data.frame(id = dimnames(temp1)$id, as.data.frame.matrix(temp1))
#   id  c  f  v
# 1  1 15 10 10
# 2  2  5  5 20
Run Code Online (Sandbox Code Playgroud)

更新:更直接的方法

我总是忘记tapply,但这个例子很方便.

tapply(df$spent, list(df$id, df$period), mean)
#    c  f  v
# 1 15 10 10
# 2  5  5 20
Run Code Online (Sandbox Code Playgroud)