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))。これにより、各州に 1 つずつ、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 に答える