Назначьте установленные значения случайным образом по идентификатору в R

У меня есть этот файл:

ID  P
1   10
1   12
1   11
2   9
2   8
2   10
3   11
3   12
3   14
4   15
4   16
4   8
5   11
5   13
5   10
6   14
6   16
6   11

И я хотел бы случайным образом присвоить эти значения (a,b,c) файлу:

как это:

ID  P   Group
1   10  a
1   12  b
1   11  c
2   9   c
2   8   a
2   10  b
3   11  a
3   12  c
3   14  b
4   15  c
4   16  a
4   8   b
5   11  b
5   13  c
5   10  a
6   14  b
6   16  c
6   11  a

Мне нужно сделать несколько раз, каждый раз в случайном порядке. Я пробовал это:

df %>% group_by(ID) %>% replicate(1,sample(df$group))

но точно не получилось. Какое-то предложение?


person Curious G.    schedule 09.11.2020    source источник


Ответы (2)


Вот вариант с sample

library(dplyr)
df1 %>%
     group_by(ID) %>%
     mutate(Group = sample(c('a', 'b', 'c'), n(), replace = TRUE))

данные

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L), P = c(10L, 12L, 11L, 9L, 8L, 
10L, 11L, 12L, 14L, 15L, 16L, 8L, 11L, 13L, 10L, 14L, 16L, 11L
)), class = "data.frame", row.names = c(NA, -18L))
person akrun    schedule 09.11.2020

Два решения, одно с группировкой, другое без

library(tidyverse)
df <- dplyr::tribble(
    ~ID, ~P,
    1,10,
    1,12,
    1,11,
    2,9,
    2,8,
    2,10,
    3,11,
    3,12,
    3,14,
    4,15,
    4,16,
    4,8,
    5,11,
    5,13,
    5,10,
    6,14,
    6,16,
    6,11
)

sample_vector <- c("a","b","c")

##Without grouping id
df_2 <- df %>%
    mutate(Group = sample(sample_vector, nrow(df), replace = TRUE))

##With grouping by ID
df_2 <- df %>% group_by(ID) %>%
    mutate(Group = sample(sample_vector, n(), replace = TRUE))
person Henry Cyranka    schedule 09.11.2020