【问题标题】:select random group of observations (rows) from grouped data从分组数据中选择随机观察组(行)
【发布时间】:2018-03-28 11:40:42
【问题描述】:

我对两个人进行了四年的重复观察。如何随机选择一年中的所有观测值?

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。给定不同时期的有数据和无数据,随机年份应特定于每个人。随机年份必须是收集了观察结果的年份,这因人而异。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我相信这就是您正在寻找的:

    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)) 将使每一年的选择概率相同,并排除cmets 中提到的缺失值。

    【讨论】:

    • 我没想过在dplyr之外工作。我已经为问题和数据集添加了细节,特别是在某些年份添加了NAs。我需要每个人的随机年份不同。
    • 光滑。还可以将第 2 行更改为 filter(Year == sample(Year[!is.na(Value)], 1)) 以过滤掉带有 NA 的年份。
    • 哦,是的。好点,因为我正在对样本大小不均匀的向量进行采样,所以概率不会相等。这个例子很好,但感谢评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多