2014-02-02 19 views
3

Я пытаюсь вычислить среднее значение для своих данных, но я боюсь двух вещей: 1. получения правильной компоновки и 2. включая недостающие значения в результатах.Совокупные и отсутствующие значения

#My input data: 
Stock <- c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B") 
Soil <- c("Blank", "Blank", "Control", "Control", "Clay", "Clay", "Blank", "Blank", "Control", "Control", "Clay", "Clay") 
Nitrogen <- c(NA, NA, 0, 0, 20, 20, NA, NA, 0, 0, 20, 20) 
Respiration <- c(112, 113, 124, 126, 139, 137, 109, 111, 122, 124, 134, 136) 
d <- as.data.frame(cbind(Stock, Soil, Nitrogen, Respiration)) 

#The outcome I'd like to get: 
Stockr <- c("A", "A", "A", "B", "B", "B") 
Soilr <- c("Blank", "Control", "Clay", "Blank", "Control", "Clay") 
Nitrogenr <- c(NA, 0, 20, NA, 0, 20) 
Respirationr <- c(111, 125, 138, 110, 123, 135) 
result <- as.data.frame(cbind(Stockr, Soilr, Nitrogenr, Respirationr)) 

Большое спасибо за вашу помощь!

ответ

1

Вот решение с ddply из plyr пакета:

library(plyr) 
ddply(d, .(Stock, Soil, Nitrogen), summarise, 
     Respiration = mean(as.numeric(as.character(Respiration)))) 

# Stock Soil Nitrogen Respiration 
# 1  A Blank  <NA>  112.5 
# 2  A Clay  20  138.0 
# 3  A Control  0  125.0 
# 4  B Blank  <NA>  110.0 
# 5  B Clay  20  135.0 
# 6  B Control  0  123.0 

Пожалуйста, обратите внимание, что cbind не является хорошим способом, чтобы создать кадр данных. Вместо этого вы должны использовать data.frame(Stock, Soil, Nitrogen, Respiration). Из-за вашего подхода все столбцы d являются факторами. Я использовал as.numeric(as.character(Respiration)) для получения числовых значений этого столбца.

1

Вы можете использовать комбинацию aggregate и merge:

d <- data.frame(Stock=Stock, Soil=Soil, 
       Nitrogen=Nitrogen, Respiration=Respiration) 

## aggregate values; don't remove NAs (na.action=NULL) 
nitrogen <- aggregate(Nitrogen ~ Stock + Soil, data=d, FUN=mean, na.action=NULL) 
respiration <- aggregate(Respiration ~ Stock + Soil, data=d, FUN=mean) 

## merge results 
merge(nitrogen, respiration) 

# Stock Soil Nitrogen Respiration 
#1  A Blank  NA  112.5 
#2  A Clay  20  138.0 
#3  A Control  0  125.0 
#4  B Blank  NA  110.0 
#5  B Clay  20  135.0 
#6  B Control  0  123.0 
0

один больше, вы можете использовать data.table:

require(data.table) 
d1 = data.table(d) 
sapply(colnames(d1)[3:4],function(x) d1[[x]] <<- as.numeric(d1[[x]])) 
d1[,list("AVG_Nitro"=mean(Nitrogen,na.rm=T),"AVG_Resp"=mean(Respiration,na.rm=T)),by="Stock,Soil"] 

    Stock Soil AVG_Nitro AVG_Resp 
1:  A Blank  NaN 112.5 
2:  A Control   0 125.0 
3:  A Clay  20 138.0 
4:  B Blank  NaN 110.0 
5:  B Control   0 123.0 
6:  B Clay  20 135.0 
Смежные вопросы