2

在 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 行的数据框,每个州一个。但是我需要返回到原始数据框并将状态的平均值放在属于该状态的行中。

我该怎么做呢?

4

5 回答 5

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
于 2012-08-14T03:35:24.377 回答
4

使用合并命令,例如

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)
于 2012-08-14T03:20:19.973 回答
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))
于 2012-08-14T03:25:49.627 回答
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)
于 2012-08-14T04:00:48.203 回答
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')
于 2012-08-14T03:25:40.607 回答