Выберите равномерно распределенный образец в таблице данных - PullRequest
0 голосов
/ 11 мая 2018

Предположим, у меня есть пример набора данных, который выглядит следующим образом:

df = data.table(id = 1:100,group=rep(c('a','b','c','d'),25))

Я бы хотел взять, скажем, 80 наблюдений из этого набора в x неперекрывающихся выборках.Важной особенностью является то, что распределение каждого образца должно быть равномерным среди каждой группы.

Например:

x=20 will give a first sample of
1 a
5 b
15 c
28 d

Это очень удобный пример, но он также должен быть применим к менее удобномуслучаи (например, когда x = 7).

Моя первая попытка использовала split , например:

df_split = split(df, as.numeric(as.factor(df$id)) %% 7)

, которая делает то, что я хочу, кроме того, что делаетнеравномерно выбирать из каждой группы!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Если я правильно понимаю, так как вы ищете 7 наборов из 80 сэмплов, вы можете запустить это как цикл:

dt <- data.table(id = 1:100,group=rep(c('a','b','c','d'),25))

newmat <- data.frame(Index = 1:80)
for(i in 1:7){
  k <- NULL
  for(j in unique(dt$group)){
    dt.sub <- dt[group == j]
    samps <- sample_n(dt.sub, 20, replace = F)
    k <- c(k,samps$id)
  }
  newmat <- cbind(newmat, k)
}

colnames(newmat) <- c("Index", paste0("k",1:7))
0 голосов
/ 11 мая 2018

Если я правильно понял, это может быть то, что вы ищете:

df = data.frame(id = 1:100,group=rep(c('a','b','c','d'),25))

repeat {
  mysample <- sample(df$id, size=4, replace=TRUE)  # takes sample
  test     <- (sum(duplicated(df[mysample, ]$group)) == 0)  # true if no duplicates

  if (test == 1)
    break
}

mysample
df[mysample, ]  # retrieves data
...