Как заменить значения столбца на основе условия и случайной выборки? - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над столбцом Gender, в котором в качестве значений используются коэффициенты, а именно: «Мужской», «Женский» и «Общий». «Итого» не требуется, поэтому я решил заменить половину значений «Итого» мужчинами, а остальные - женщинами. Столбец простой, и я преобразовал все коэффициенты в цифры через основную строку as.numeric(factor()):

Gender     NewGender
Male       1
Female     2
Total      3
Total      3
.
.
Female     2

Теперь следующим шагом является замена всех 3 с 1 и 2, но в случайном порядке .

Всего имеется 55 399 наблюдений, из которых 22 057 соответствуют трем в столбце NewGender. Я попробовал какой-то уникальный набор команд, из которых я считаю ближайший:

# Experiment with 50 rows

for (row in data$NewGender[sample(which(data$NewGender, 50), ]) {
        if (row == 3) {row <- 1; row <- row + 1}
}

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

data$NewGender[data$NewGender == 3] <- 1

Но я не могу вложить его методом sample(). То, что я хочу, это Newgender, содержащий только единицы и двойки, при этом половина всех тройок заменяется на единицу, а остальная половина должна быть полностью рандомизирована. Есть хорошие предложения? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Я бы сказал, что проще всего использовать sample и ifelse , также вам, вероятно, следует выбрать образец на основе распределения мужчин / женщин.

# Some data
gender <- sample(c("male", "female", "other"), 100, prob = c(0.4, 0.3, 0.3), replace = TRUE)

# Calculating proportion of females vs males
male_prop <- sum(gender=="male")/(sum(gender=="male")+sum(gender=="female"))
female_prop <- sum(gender=="female")/(sum(gender=="male")+sum(gender=="female"))

# Replacing other at random
gender <- ifelse(gender=="other", sample(c("male", "female"), 1, prob = c(male_prop, female_prop), replace = TRUE), gender)

Примечание. Как и в случае ответа Markus, рекомендуется установить начальное число для обеспечения воспроизводимости.

0 голосов
/ 24 апреля 2019

Вы можете использовать replace и sample.

Дан вектор, содержащий числа от 1 до 3:

set.seed(1)
NewGender <- sample(1:3, 20, TRUE)
table(NewGender)
#NewGender
#1 2 3 
#5 7 8 

Мы создаем логический вектор, TRUE где NewGender равно 3.

idx <- NewGender == 3

Теперь мы заменяем 3 на выборку 1 и 2

out <- replace(NewGender, idx, sample(1:2, sum(idx), TRUE))

Проверьте распределение

table(out)
#out
# 1  2 
#11  9 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...