#r
#r
Вопрос:
Я работаю над Gender
столбцом, который имеет факторы в качестве значений, а именно «Мужской», «Женский» и «Общий». ‘Total’ не нужен, и поэтому я решил заменить половину значений ‘Total’ на male, а остальным присвоить значение female. Столбец прост, и я преобразовал все коэффициенты в цифры через основную 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
содержит только единицы и двойки, при этом половина всех троек заменена на единицы, а остальная половина — на двойки, полностью рандомизированные. Есть хорошие предложения? Заранее спасибо.
Ответ №1:
Я бы сказал, что проще всего использовать 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)
Примечание: Как и в ответе Маркуса, рекомендуется установить начальное значение для обеспечения воспроизводимости.
Ответ №2:
Вы можете использовать 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