在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行的数据帧,每个状态一个。但我需要回到原始数据框并将状态的平均值放在属于该状态的行中。
我将如何做到这一点?
答案 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')