Передискретизация с заменой на кластер

Я хочу нарисовать кластеры (определяемые переменной id) с заменой из набора данных, и, в отличие от ранее отвеченных вопросов, я хочу, чтобы кластеры, которые выбираются K раз, повторяли каждое наблюдение K раз. То есть я выполняю загрузку кластера.

Например, следующие примеры id=1 дважды, но повторяют наблюдения для id=1 только один раз в новом наборе данных s. Я хочу, чтобы все наблюдения от id=1 появлялись дважды.

f = data.frame( id=c(1,1,2,2,2,3,3), X = rnorm(7) )
set.seed(451); new.ids = sample( unique(f$id), replace=TRUE )
s = f[ f$id %in% new.ids, ]

person half-pass    schedule 09.05.2017    source источник


Ответы (2)


Один из вариантов - lapply над каждым new.id и сохранять его в списке. Затем вы можете сложить все это вместе:

  library(data.table)
  rbindlist(lapply(new.ids, function(x) f[f$id %in% x,]))
#  id           X
#1:  1  1.20118333
#2:  1 -0.01280538
#3:  1  1.20118333
#4:  1 -0.01280538
#5:  3 -0.07302158
#6:  3 -1.26409125
person Mike H.    schedule 09.05.2017

На всякий случай понадобится «new_id», который соответствует номеру индекса (то есть порядку выборки) - (мне нужно было «new_id», чтобы я мог запускать модели со смешанными эффектами, не имея нескольких экземпляров кластера, рассматриваемых как один кластер, потому что они имели один и тот же идентификатор):

library(data.table)
f = data.frame( id=c(1,1,2,2,2,3,3), X = rnorm(7) )
set.seed(451); new.ids = sample( unique(f$id), replace=TRUE )
## ss has unique valued `new_id` for each cluster
ss = rbindlist(mapply(function(x, index) cbind(f[f$id %in% x,], new_id=index),
                      new.ids,
                      seq_along(new.ids),
                      SIMPLIFY=FALSE
))
ss

который дает:

> ss
   id          X new_id
1:  1 -0.3491670      1
2:  1  1.3676636      1
3:  1 -0.3491670      2
4:  1  1.3676636      2
5:  3  0.9051575      3
6:  3 -0.5082386      3

Обратите внимание, что значения X отличаются, потому что set.seed не устанавливается перед вызовом rnorm(), но идентификатор совпадает с ответом @Mike H.

Эта ссылка была полезна мне при построении этого ответа: R lapply statement с индексом [дубликат]

person swihart    schedule 13.12.2018