2012-08-14 63 views
2

在R,I有一組數據中像數據幀:如何創建一個包含聚合方式與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

澄清:你只需要國家的意思,而不是由國家+拉鍊意思了吧? – A5C1D2H2I1M1N2O1R2T1 2012-08-14 03:26:23

+0

@mrdwab:正確的,我想整個國家的意思。 – int3h 2012-08-14 03:53:35

+3

我可以問爲什麼沒有upvotes這個問題,儘管有(當前)五> = 2個答案?我錯過了什麼嗎? – 2012-08-14 06:46:25

回答

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') 
+0

這與@ blindJesse的[answer](http://stackoverflow.com/a/11945344/1270695)有什麼不同? – A5C1D2H2I1M1N2O1R2T1 2012-08-14 03:28:09

+0

這裏的'by'是不同的。這工作完美!謝謝! – int3h 2012-08-14 03:32:14

+0

他的回答似乎是在我打開這個問題並提交我的答案之間到來的。 – 2012-08-14 03:34:25

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) 
+1

與接受的答案一樣,這裏有可變名稱重複:'df'兩次,'df2'兩次。請參閱[這裏](http://stackoverflow.com/a/10758086/403310)爲什麼變量名重複有時會導致錯誤。 – 2012-08-14 10:01:57

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)) 
+2

你也可以使用'mutate'而不是'transform'。 – mnel 2012-08-14 03:40:40

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 
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) 
+0

+1雖然這個答案重複了'dat'三次。請參閱[這裏](http://stackoverflow.com/a/10758086/403310)瞭解變量名稱重複如何有時會導致錯誤。 – 2012-08-14 09:59:48

相關問題