2017-10-16 120 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

哦,是的。好点,因为我正在采样具有不均匀样本大小的向量,所以概率将不相等。这个例子没什么问题,但非常感谢评论。 –