2017-10-16 123 views
3

我對兩個跨越四年的個體重複觀察。我怎樣才能隨機選擇一年中的所有觀察結果?從分組數據中隨機選擇一組觀察值(行)

set.seed(123) 
    dat <- data.frame(IndID = rep(c("AAA", "BBB"), each = 100), 
         Year = sample(c("2001", "2002", "2003", "2005"),200, replace = T), 
         Value = rnorm(200)) 
dat$Value[dat$IndID == "AAA" & dat$Year == "2002"] <- NA 
dat$Value[dat$IndID == "BBB" & dat$Year == "2005"] <- NA 

注意,個人年組合之間的不同的樣本量。

table(dat$IndID, dat$Year) 

     2001 2002 2003 2005 
    AAA 26 27 20 27 
    BBB 20 30 30 20 

另請注意,並非所有年份都有數據。

dat %>% group_by(IndID, Year) %>% 
    summarise(NoDat = sum(is.na(Value))) %>% 
    as.data.frame() 
    IndID Year NoDat 
1 AAA 2001  0 
2 AAA 2002 27 
3 AAA 2003  0 
4 AAA 2005  0 
5 BBB 2001  0 
6 BBB 2002  0 
7 BBB 2003  0 
8 BBB 2005 20 

我已經看到了一些有用的例子爲一組中選擇特定行(即頂部,最後,n個隨機等),但我不連接有關如何在組內選擇的所有行的點點滴滴。在這裏,我想要爲每個人隨機選擇一年的所有數據,最好是dplyr。隨機的年份應該是特定於每個人在不同的時間段有和沒有數據。隨機年份需要與收集到的觀察結果一致,因此在個體之間會有所不同。

回答

2

我相信這是你在找什麼:

set.seed(123) 
dat <- data.frame(IndID = rep(c("AAA", "BBB"), each = 100), 
        Year = sample(c("2001", "2002", "2003", "2005"),200, replace = T), 
        Value = rnorm(200)) 
rand_year <- sample(dat$Year,1) 
dat %>% 
    filter(Year == rand_year) 

這裏是編輯的版本,你得到隨機每年爲每個參與者(注意,今年可能是相同的):

result <- dat %>% 
    group_by(IndID) %>% 
    filter(Year == sample(Year, 1)) 

並且用filter(Year == sample(unique(Year[!is.na(Value)]), 1))代替filter()行將給出每年選擇相同的概率並排除註釋中提到的缺失值。

+0

我沒有想過在'dplyr'之外工作。我已經爲這個問題和數據集增加了具體內容,特別是在某些年份增加了「NA」。我需要每個人的隨機年份不同。光滑的 –

+0

。也可以將第2行更改爲'過濾器(年份== sample(年份[!is.na(Value)],1))',用'NA'過濾掉年份。 –

+0

哦,是的。好點,因爲我正在採樣具有不均勻樣本大小的向量,所以概率將不相等。這個例子沒什麼問題,但非常感謝評論。 –