Более эффективная блочная передискретизация кадра данных R - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь выполнить повторную выборку кадра данных R кластеризованным / заблокированным способом. Я делаю это с помощью приведенного ниже фрагмента кода, но он довольно медленный:

    index_sample <- sample(unique(data[[cluster_var]]), 
                           size=length(unique(data[[cluster_var]])), replace=T)

    indices <- unlist(sapply(index_sample, FUN=function(x) {which(data[[cluster_var]] == x)}))

Есть ли более эффективный способ сделать это? В частности, шаг unlist / sapply кажется очень медленным.

Пример желаемого поведения:

set.seed(1919)
data <- data.frame(x=sample(seq(1,5,1), 20, replace=TRUE),
                   y = runif(20))
index_sample <- sample(unique(data[['x']]), 
                       size=length(unique(data[['x']])), replace=T)
indices <- unlist(sapply(index_sample, FUN=function(x) {which(data[['x']] == x)}))
print(indices)
[1]  7  8  9 10 14 17 20  7  8  9 10 14 17 20  1 12  2 18 19  6 11 13 16    

1 Ответ

2 голосов
/ 29 мая 2020

Мы можем использовать outer

indices2 <- which(outer(data$x, index_sample, FUN = `==`), arr.ind = TRUE)[,1]

-тестирование с решением OP

identical(indices, indices2)
#[1] TRUE
...