从分组数据中选择随机观察组(行)

时间:2017-10-16 20:57:32

标签: r dplyr

我对两个人跨越四年重复观察。如何随机选择一年中的所有观察结果?

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。随机年份应该针对每个人在具有和不具有数据的不同时期。随机年份需要是收集观察的一年,因人而异。

1 个答案:

答案 0 :(得分: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()行替换为filter(Year == sample(unique(Year[!is.na(Value)]), 1))将使每年选择的概率相同,并排除评论中提到的缺失值。