2014-01-08 4 views
0

У меня есть (возможно, простой) вопрос, который я не могу понять.Как написать цикл к случайному образцу из нескольких подмножеств данных?

Я хотел бы написать цикл (или использовать mapply или ddply?) Для случайного отбора трех значений из каждого из нескольких подмножеств данных и найти среднее значение для этой случайной выборки и поместить ее в кадр данных.

Например, вот небольшая часть данных:

BayStation DIN Year 
1  60069 0.0090 1998  
2  60069 0.0060 1998  
3  60069 0.0100 1998  
4  60069 0.0020 1998  
5  60069 0.0140 1998  
6  60069 0.0110 1998  
7  60081 0.0140 1998  
8  60081 0.0140 1998  
9  60081 0.0060 1998  
10  60081 0.0020 1998  
11  60081 0.0250 1998  
12  60081 0.0140 1998  
13  60081 0.0110 1998  

Хочу подмножества по BayStation, случайным образом образец три значения для каждого DIN BayStation, и вычислить среднее значение. Я знаю, как сделать это для один лавровых станций:

test<-mean(sample(DIN1998$DIN[DIN1998$BayStation=="60081"], 
        3, replace = FALSE, prob = NULL)) 

Но я хотел бы знать, как я мог бы сделать это в течение всего dataframe, с сотнями станций. Может ли кто-нибудь сказать мне, как это сделать? Или дать большой намек? Безопасно сказать, мои навыки R очень просты - спасибо заранее!

ответ

0

Вот один подход

> set.seed(1) 
> sapply(split(DIN1998$DIN, DIN1998$BayStation), function(x){ 
    mean(sample(x, 3)) 
    }) 
    60069  60081 
0.00900000 0.01666667 

Если data.frame слишком велик, то вы можете использовать data.table

> library(data.table) 
> dt <- data.table(DIN1998) 
> set.seed(1) 
> dt[,list(Mean=mean(sample(DIN, 3))), by="BayStation"] 
    BayStation  Mean 
1:  60069 0.00900000 
2:  60081 0.01666667 

Другой R Базовый раствор

> set.seed(1) 
> cbind(Mean.by.BayStation=with(DIN1998, 
           by(DIN, BayStation, function(x) 
            mean(sample(x, 3))))) 
     Mean.by.BayStation 
60069   0.00900000 
60081   0.01666667 
0

Вы можете использовать tapply:

with(DIN1998, tapply(DIN, BayStation, function(x) mean(sample(x), 3))) 
# 60069 60081 
# 0.0095 0.0140 

или aggregate:

aggregate(DIN ~ BayStation, DIN1998, function(x) mean(sample(x), 3)) 
# BayStation DIN 
# 1  60069 0.0095 
# 2  60081 0.0140 
1

Если вы хотите использовать plyr

ddply(DIN1998, .(BayStation), 
     summarise, 
     sample.mean=mean(sample(DIN, 3, replace=FALSE, prob=NULL))) 

с set.seed(1) вы получите

BayStation sample.mean 
1  60069 0.00900000 
2  60081 0.0166666