#r #random #group-by #sample
#r #Случайный #группа-по #образец
Вопрос:
У меня есть следующая таблица:
Имя | Группа |
---|---|
a | 1 |
b | 1 |
c | 2 |
d | 2 |
e | 3 |
f | 3 |
и я хочу случайным образом переназначить членство в группе, (i) убедившись, что имена не будут назначены одной и той же группе, и (ii) вероятность членства в группе останется прежней. Кроме того, я пытаюсь (iii) избежать того, чтобы все имена в одной и той же группе были назначены одной и той же новой группе. В сущности, я хочу добиться чего-то подобного:
Имя | Группа | новая группа |
---|---|---|
a | 1 | 2 |
b | 1 | 3 |
c | 2 | 1 |
d | 2 | 3 |
e | 3 | 1 |
f | 3 | 2 |
Как мне это сделать R
?
Ответ №1:
Базовый вариант R с использованием sample
setdiff
transform( df, new.group = ave(group, group, FUN = function(x) sample(setdiff(group, x),length(x))) )
дает
name group new.group 1 a 1 2 2 b 1 3 3 c 2 1 4 d 2 3 5 e 3 1 6 f 3 2
Данные
gt; dput(df) structure(list(name = c("a", "b", "c", "d", "e", "f"), group = c(1L, 1L, 2L, 2L, 3L, 3L)), class = "data.frame", row.names = c(NA, -6L))
Ответ №2:
Со всеми ограничениями это уже почти не тасуется: вы можете использовать оператор по модулю.
df %gt;% group_by(group) %gt;% mutate(new_group = (2 row_number() group) %% 3 1) name group new_group lt;chrgt; lt;intgt; lt;dblgt; 1 a 1 2 2 b 1 3 3 c 2 3 4 d 2 1 5 e 3 1 6 f 3 2