Как заменить значения столбца на основе условия и случайной выборки?

#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