Как выбрать дискретное распределение, зависящее от фактора внутри цикла for - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь сгенерировать фиктивные данные путем выборки из определенного дискретного распределения - в зависимости от уровней фактора (поэтому различное распределение для каждого уровня фактора), а затем хочу вставить каждый случайный результат в новый столбец данных встрока, соответствующая уровню фактора.Если вы запустите код ниже, вы увидите, что «data $ last» пусто.Я не уверен, что я делаю неправильно, я пробовал и без цикла, установив репликации на 100 для каждого уровня - однако распределения неправильные.

#Create data frame with factor 
set.seed(1)
ID<-(1:200)
gender<-sample(x = c("Male","Female"), 200, replace = T, prob = c(0.5, 0.5))
data<-data.frame(ID,gender)

#Generate random response based on discrete distribution conditional on gender
data$last <- for (i in 1:nrow(data)) {if(data$gender=="Male") {
sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.8, 0.2))
} else {
sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.3, 0.7))
}
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019
#Generate random response based on discrete distribution conditional on gender
data$last <- sapply(1:nrow(data),function(i){if(data$gender[i]=="Male") {
  s =sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.8, 0.2))
} else {
  s = sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.3, 0.7))
}
  return(s)
})

Проверьте, как вы выглядите не для конкретного data$gender, а для всего вектора. Кроме того, вернуть результат, используя return(s)

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

Вы должны переписать свой цикл for, чтобы назначить каждому последнему значению данных $ внутри цикла:

for (i in 1:nrow(data)) {
  if(data$gender[i]=="Male") {
    data$last[i] = sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.8, 0.2))
  } else {
    data$last[i] = sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.3, 0.7))
  }
}

или без цикла:

data$last = ifelse(data$gender=="Male", 
               sample(x = c("Today","Yesterday"), length(data$gender[(data$gender=="Male")==TRUE]), replace = T, prob = c(0.8, 0.2)), 
               sample(x = c("Today","Yesterday"), length(data$gender[(data$gender!="Male")==TRUE]), replace = T, prob = c(0.3, 0.7)))
...