Учитывая вашу точность, я думаю, что простое решение - использовать слияние . Сначала вы генерируете 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