Этот вопрос, вероятно, лучше всего проиллюстрирован примером.
Предположим, у меня есть фрейм данных df
с двоичной переменной b
(значения b равны 0 или 1). Как я могу взять случайную выборку размером 10 из этого фрейма данных, чтобы у меня было 2 экземпляра, где b = 0 в случайной выборке, и 8 экземпляров, где b = 1 в фрейме данных?
Прямо сейчас я знаю, что могу сделать df[sample(nrow(df),10,]
, чтобы получить часть ответа, но это даст мне случайное количество 0 и 1 экземпляров. Как я могу указать определенное количество экземпляров 0 и 1, при этом выбирая случайную выборку?
Возможно, если я смогу как-то объединить образцы. Мне нужно рассчитать среднее значение и стандартное отклонение другой переменной в выборке, поэтому было бы лучше, если бы я мог взять только одну выборку.
Вот пример того, как я это сделаю... возьму два образца и скомбинирую их. Я написал простую функцию, чтобы вы могли «просто взять один образец».
С вектором:
pop <- sample(c(0,1), 100, replace = TRUE)
yoursample <- function(pop, n_zero, n_one){
c(sample(pop[pop == 0], n_zero),
sample(pop[pop == 1], n_one))
}
yoursample(pop, n_zero = 2, n_one = 8)
[1] 0 0 1 1 1 1 1 1 1 1
Или, если вы работаете с кадром данных с каким-то уникальным индексом, называемым id
:
# Where d1 is your data you are summarizing with mean and sd
dat <- data.frame(
id = 1:100,
val = sample(c(0,1), 100, replace = TRUE),
d1 = runif (100))
yoursample <- function(dat, n_zero, n_one){
c(sample(dat[dat$val == 0,"id"], n_zero),
sample(dat[dat$val == 1,"id"], n_one))
}
sample_ids <- yoursample(dat, n_zero = 2, n_one = 8)
sample_ids
mean(dat[dat$id %in% sample_ids,"d1"])
sd(dat[dat$id %in% sample_ids,"d1"])
Вот предложение:
Сначала создайте образец 0 и 1 с идентификатором столбца. Затем попробуйте 2:8 df с условием и свяжите их вместе:
library(tidyverse)
set.seed(123)
df <- as_tibble(sample(0:1,size=50,replace=TRUE)) %>%
mutate(id = row_number())
df1 <- df[ sample(which (df$value ==0) ,2), ]
df2 <- df[ sample(which (df$value ==1), 8), ]
df_final <- bind_rows(df1, df2)
value id
<int> <int>
1 0 14
2 0 36
3 1 21
4 1 24
5 1 2
6 1 50
7 1 49
8 1 41
9 1 28
10 1 33
library(tidyverse)
set.seed(123)
df <- data.frame(a = letters,
b = sample(c(0,1),26,T))
bind_rows(
df %>%
filter(b == 0) %>%
sample_n(2),
df %>%
filter(b == 1) %>%
sample_n(8)
) %>%
arrange(a)
a b
1 d 1
2 g 1
3 h 1
4 l 1
5 m 1
6 o 1
7 p 0
8 q 1
9 s 0
10 v 1
Можете ли вы просто взять два образца, один размером 2, где b = 0, и один размером 8, где b = 1?