R - подмножество исходных данных: N случайных наблюдений, 50% N имеют этническую принадлежность E, а 50% N имеют образование E - PullRequest
0 голосов
/ 07 октября 2019

Привет, пользователи Stackoverflow,

Я новичок в R и учусь только пару недель. У меня есть фрейм данных с 15 строковыми переменными о характеристиках людей (например, этническая принадлежность, образование, страна происхождения);одна строка - один человек.

Как я могу сказать R создать подмножество исходного фрейма данных таким образом, чтобы этот новый фрейм данных включал в себя N случайных людей (которые были нарисованы с заменой), 50% из N имеетЭтническая принадлежность ET, а 50% N имеет образование ED? Я знаю основные A) и B)

A) Я знаю, как провести N наблюдений в произвольном порядке с заменой, как это было предложено здесь и здесь . Например:

df[sample(nrow(df), size=N, replace=TRUE), ]

B) В этом другом посте приведены примеры того, как подготовить случайную ничью (без замены).

df[ sample( which( df$Ethnicity== "ET" | df$Education= "ED" ) , N ) , ]

Однако я хотел бы знать, как делать более сложные условные розыгрыши, то есть 50% N должны иметь этническую принадлежность ET, а 50% N должны иметь образование ED. Таким образом, в этой новой выборке размера N два условия только частично пересекаются: для некоторых людей этническая принадлежность == ET и образование == ED, для некоторых людей этническая принадлежность! = ET & Education == ED, для некоторых людей этническая принадлежность == ET& Education! = ED, для некоторых людей Этнос! = ET & Education! = ED.

1 Ответ

1 голос
/ 07 октября 2019

Простым решением было бы sample 1/4 для каждой комбинации, надеясь, что эта комбинация существует:

n  <- 1e2 / 4
y <- x[c(sample(which(x$et & x$ed), n, TRUE)
         , sample(which(!x$et & x$ed), n, TRUE)
         , sample(which(x$et & !x$ed), n, TRUE)
         , sample(which(!x$et & !x$ed), n, TRUE)),]
table(y)
#       ed
#et      FALSE TRUE
#  FALSE    25   25
#  TRUE     25   25

В случае, если комбинация не существует, вы можете получить пропорциюкаждая комбинация с table как:

n  <- 1e2
x  <- x[!x$et | x$ed,]
tt  <- table(x)
tt  <- tt * t(tt)
tt <- tt / rowSums(tt) 
tt <- tt / rep(colSums(tt), each=2)
tt <- round(prop.table(tt)*n) #Here the target number might not be reached
y <- x[c(sample(which(!x$et & !x$ed), tt[1], TRUE)
         , sample(which(x$et & !x$ed), tt[2], TRUE)
         , sample(which(!x$et & x$ed), tt[3], TRUE)
         , sample(which(x$et & x$ed), tt[4], TRUE)),]
table(y)
#       ed
#et      FALSE TRUE
#  FALSE    50    0
#  TRUE      0   50

Данные:

set.seed(7)
n  <- 1e4
x  <- data.frame(et=sample(c(TRUE,FALSE), n, TRUE, c(.25,.75)), ed=sample(c(TRUE,FALSE), n, TRUE, c(.75,.25)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...