случайным образом переназначайте членство в группе с условием

#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