2015-11-10 3 views
1

У меня есть dataframe:dplyr: размер выборки больше, чем численность населения

> class(dataset) 
[1] "grouped_df" "tbl_df"  "tbl"  "data.frame" 
> dim(dataset) 
[1] 64480 39 

, где я хочу попробовать 50.000 образцов из

> dataset %>% dplyr::sample_n(50000) 

Но продолжает давать мне ошибку

Error: Sample size (50000) greater than population size (1). Do you want replace = TRUE? 

Но, например, что работает:

> dim(dataset[1] %>% dplyr::sample_n(50000)) 
[1] 50000  1 

Так почему же мой размер популяции (1) - это имеет что-то TODO с группировкой?

+0

Просьба привести воспроизводимый пример. dplyr выводит ошибку о ваших данных, поэтому, чтобы ответить на вопрос, нам нужно увидеть ваши данные (образец его или составленный пример). – Tim

+0

Скорее всего, это будет группировка, поскольку у вас есть '" grouped_df "'. Попробуйте разгруппировать его и запустить тот же код. – AntoniosK

+2

Да, это, вероятно, связано с группировкой. Как вы можете видеть из вывода 'class (dataset)' ваши данные в настоящее время сгруппированы, и некоторые группы могут иметь слишком мало наблюдений для образца 50000 без замены. Попробуйте 'dataset%>% ungroup()%>% dplyr :: sample_n (50000)' –

ответ

3

Да, это, вероятно, связано с группировкой. Как вы можете видеть на выходе class(dataset) ваши данные в настоящее время сгруппированы (обратите внимание на информацию grouped_df), и одна или несколько групп, по-видимому, имеют слишком мало наблюдений для выборок 50000 наблюдений без замены.

Чтобы решить эту проблему, вы можете разгруппировать данные перед выборкой:

dataset %>% ungroup() %>% sample_n(50000) 

Или вы можете попробовать с заменой:

dataset %>% sample_n(50000, replace = TRUE) 
+0

Но можете ли вы указать, чтобы выбрать либо конкретное значение, либо максимальное значение строк? Было бы неплохо подбирать очень большие группы, но не нужно было бы перепрограммировать небольшие группы для достижения этого. – evolvedmicrobe

2

К сожалению, dplyr не позволяет "Sample вниз" большие группы до заданного размера или просто использовать все данные группы, если это небольшая группа - либо вы должны отбирать все до наименьшего размера группы, либо образец самой маленькой группы с заменой, чтобы «раздуть» ее до большего размера. Вы можете обойти это, указав специальную функцию sample_n следующим образом:

### Custom sampler function to sample min(data, sample) which can't be done with dplyr 
### it's a modified copy of sample_n.grouped_df 
sample_vals <- function (tbl, size, replace = FALSE, weight = NULL, .env = parent.frame()) 
{ 
    #assert_that(is.numeric(size), length(size) == 1, size >= 0) 
    weight <- substitute(weight) 
    index <- attr(tbl, "indices") 
    sizes = sapply(index, function(z) min(length(z), size)) # here's my contribution 
    sampled <- lapply(1:length(index), function(i) dplyr:::sample_group(index[[i]], frac = FALSE, tbl = tbl, 
             size = sizes[i], replace = replace, weight = weight, .env = .env)) 
    idx <- unlist(sampled) + 1 
    grouped_df(tbl[idx, , drop = FALSE], vars = groups(tbl)) 
} 

samped_data = dataset %>% group_by(something) %>% sample_vals(size = 50000) %>% ungroup() 
+0

Вы можете достичь больших массивов «Образец вниз» до заданного размера или просто использовать все данные группы, если это небольшая группа, если вы используете 'sample_frac (1)' и filter: http://stackoverflow.com/questions/30950016/dplyr-sample-n-where-n-is-the-value-of-a-grouped-variable – Alex

+0

О, хорошо, но это создало бы создание совершенно нового фрейма данных с перестановочными строками перед выборкой? Это кажется очень дорогим. – evolvedmicrobe

+0

Я не знаю об этом :) – Alex

Смежные вопросы