如何使用R创建包含聚合方式的列?

时间:2012-08-14 03:13:28

标签: r dataframe aggregate

在R中,我在数据框中有一堆数据,如:

state | zip   | value
______|_______|______
CA    | 94555 | 18
CA    | 94556 | 5
OH    | 12345 | 22
OH    | 12346 | 10

等等。

我想为每一行添加一列,列出该州的平均'值'。

我可以通过“(aggregate(data$value, list(State = data$state), mean))”获取手段的数据框。这给了我一个50行的数据帧,每个状态一个。但我需要回到原始数据框并将状态的平均值放在属于该状态的行中。

我将如何做到这一点?

5 个答案:

答案 0 :(得分:6)

data.table解决方案

library(data.table)
DT <-  data.table(state = c("CA","CA","OH","OH"), 
                   zip = c(94555,94556,12345,12346), 
                   value = c(18, 5, 22, 10))

DT[, mean := mean(value), by = state]

##    state   zip value mean
## 1:    CA 94555    18 11.5
## 2:    CA 94556     5 11.5
## 3:    OH 12345    22 16.0
## 4:    OH 12346    10 16.0

答案 1 :(得分:4)

使用merge命令,例如

df = data.frame(state=c('CA','CA','OH','OH'),zip=c(94555,94556,12345,12346),value=c(18,5,22,10))
df2 = aggregate(df$value,list(state=df$state),mean)
merge(df,df2)

答案 2 :(得分:4)

您可以使用plyr

library(plyr)
df<-data.frame(state=c("CA","CA","OH","OH"),zip=c(94555,94556,12345,12346),value=c(18,5,22,10))
out<-ddply(df,.(state),transform,mean=mean(value))
> out
  state   zip value mean
1    CA 94555    18 11.5
2    CA 94556     5 11.5
3    OH 12345    22 16.0
4    OH 12346    10 16.0
如mnel mutate所指出的

也可以使用,应该更快

ddply(df,.(state),mutate,mean=mean(value))

答案 3 :(得分:3)

这是使用遗忘的ave函数的最佳时机:

dat <- data.frame(state = c('CA','CA','OH','OH'), 
    zip = c('94555','94556','12345','12346'), 
    value = c(18,5,22,10))

dat$mean <- ave(dat$value, dat$state, FUN=mean)

答案 4 :(得分:2)

合并是关键所在。

data <- data.frame(state = c('CA','CA','OH','OH'), zip = c('94555','94556','12345','12346'), value = c(18,5,22,10))
aggs <- aggregate(data$value, list(State = data$state), mean)
names(aggs) <- c('state','avg')
merge(data, aggs, by = 'state')