Вот что я пытаюсь сделать:
Создайте новый столбец, который присваивает выборочный ранг нескольким подмножествам строк в зависимости от количества строк в каждом подмножестве. Группирующей переменной является столбец "страта".
Обычно я назначаю ранг случайным образом, используя вложенные операторы ifelse, как показано ниже. Иногда этого достаточно, но в последнее время я сталкиваюсь со все большим количеством группировок. 40 вложенных операторов ifelse могут показаться немного чрезмерными.
Есть ли более элегантный / быстрый / минимальный способ сделать это с помощью dplyr или data.table, возможно, в сочетании с apply, lapply, sapply и т. д.?
Я пробовал использовать операторы data.table, но не знаю, как вставить функцию-образец с помощью nrow.
Воспроизводимые данные:
dta <- data.frame(
uniqueID = c(950513, 951634, 951640, 951641,951646, 952732, 952895, 952909, 952910, 952911, 952912,952923, 952924, 952925, 952926, 952927, 952928L, 952933,
952934, 952935),
stratum = c("group9","group6","group15","group13","group9","group8","group9","group15","group15","group15","group15", "group13", "group13",
"group1", "group1", "group1", "group1", "group1", "group1", "group1")
)
Вот как я обычно присваиваю случайный ранг, используя оператор netsed ifelse:
dta<- dta[order(dta$stratum),]
set.seed(7265)
dta$rank <- ifelse(dta$stratum== "group1",sample(1:nrow(dta[dta$stratum== "group1",])),
ifelse(dta$stratum=="group6",sample(1:nrow(dta[dta$stratum== "group6",])),
ifelse(dta$stratum=="group8",sample(1:nrow(dta[dta$stratum== "group8",])),
ifelse(dta$stratum=="group9",sample(1:nrow(dta[dta$stratum== "group9",])),
ifelse(dta$stratum=="group13",sample(1:nrow(dta[dta$stratum== "group13",])),
ifelse(dta$stratum=="group15",sample(1:nrow(dta[dta$stratum== "group15",])),
0))))))