Назначение одного и того же случайного значения всем одной переменной? - PullRequest
1 голос
/ 13 апреля 2020

На примере mtcars я пытаюсь создать новый столбец и присвоить всем одинаковым значениям cyl одно и то же случайное значение.

Я пытался:

mtcars$cyl <- as.factor (mtcars$cyl)
mtcars %>% 
group_by(cyl) %>%
mutate (rand = sample( c("A", "B"), replace = T)

Однако длина кажется неправильной, и я не уверен, будет ли она назначать случайную букву A или B каждой строке вместо одной и той же случайной буквы A или B с одинаковым коэффициентом цил. Любое понимание, я должен создать для l oop для каждого уникального (цил)?

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Необходимо указать размер как 1 в sample, чтобы получить то же значение cyl, то же самое случайное значение.

library(dplyr)
set.seed(567)
mtcars %>% group_by(cyl) %>% mutate(rand = sample(c("A", "B"), 1)) 

#     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb rand 
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
# 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4 B    
# 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4 B    
# 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1 A    
# 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1 B    
# 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2 A    
# 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1 B    
# 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4 A    
# 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2 A    
# 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2 A    
#10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4 B    
# … with 22 more rows
0 голосов
/ 13 апреля 2020

Мы можем использовать data.table

library(data.table)
as.data.table(mtcars)[, rand :=  sample(c("A", "B", 1), cyl]
0 голосов
/ 13 апреля 2020

Учитывая вашу точность, я думаю, что простое решение - использовать слияние . Сначала вы генерируете dataframe, связывающее cyl s со случайным значением, затем объединяетесь, используя cyl

dfrand <- data.frame(
  rand = sample(c("A","B"), size = length(unique(df$cyl)), replace = TRUE),
  cyl = unique(df$cyl), stringsAsFactors = FALSE
)

dfrand
  rand cyl
1    B   6
2    A   4
3    B   8

, а затем вы объединяете. Вы можете использовать базу R

merge(df, dfrand, by = "cyl")

или dplyr:

dplyr::left_join(
  df, dfrand, by = 'cyl'
)

Результат должен выглядеть следующим образом (я беру 5 случайных строк сгенерированного кадра данных)

 merge(df, dfrand, by = "cyl")[sample(1:nrow(df), size = 5)]
   cyl  mpg  disp  hp drat   wt  qsec vs am gear carb rand
1:   8 13.3 350.0 245 3.73 3.84 15.41  0  0    3    4    B
2:   4 24.4 146.7  62 3.69 3.19 20.00  1  0    4    2    A
3:   8 17.3 275.8 180 3.07 3.73 17.60  0  0    3    3    B
4:   4 32.4  78.7  66 4.08 2.20 19.47  1  1    4    1    A
5:   4 22.8 108.0  93 3.85 2.32 18.61  1  1    4    1    A
...