'Shuffle the same dataset 10 times as each group

Dataset:

name sal
abinav 10
vinay 9
saran 15

I want output 10 times like

name sal groupv
vinay 10 group1
saran 9 group1
abinav 15 group1
vinay 15 group2
saran 10 group2
abinav 9 group2

like this 10 groups



Solution 1:[1]

You can replicate the datasets and combine the dataframe together using bind_rows.

res <- dplyr::bind_rows(replicate(10, df, simplify = FALSE), .id = 'groupv')
res

#   groupv   name sal
#1       1 abinav  10
#2       1  vinay   9
#3       1  saran  15
#4       2 abinav  10
#5       2  vinay   9
#6       2  saran  15
#...
#...
#28     10 abinav  10
#29     10  vinay   9
#30     10  saran  15

If you need the values to be Group1, Group2 instead of just 1, 2 you can paste the additional string in groupv column.

res$groupv <- paste0('Group', res$groupv)

If you want to randomise rows within each group then you can use below code.

set.seed(123)
library(dplyr)

replicate(10, df, simplify = FALSE) %>%
  bind_rows(.id = 'groupv') %>%
  sample_n(n()) %>%
  mutate(groupv = paste0('group', groupv)) %>%
  arrange(order(gtools::mixedorder(groupv)))

#    groupv   name sal
#1   group1  saran  15
#2   group1 abinav  10
#3   group1  vinay   9
#4   group2  vinay   9
#5   group2 abinav  10
#6   group2  saran  15
#...
#...
#28 group10 abinav  10
#29 group10  saran  15
#30 group10  vinay   9

Solution 2:[2]

I think you want the columns to be shuffled within each replicated group.

base R

dfn <- replicate(10, df, simplify = FALSE)
set.seed(42)
combined <- do.call(rbind,
    Map(function(x, num) { x[] <- lapply(x, sample); transform(x, group = num); },
        dfn, seq_along(dfn)))
combined
#      name sal group
# 1  abinav  10     1
# 2   saran   9     1
# 3   vinay  15     1
# 4   vinay  15     2
# 5   saran   9     2
# 6  abinav  10     2
# 7  abinav   9     3
# 8   saran  15     3
# 9   vinay  10     3
# 10  saran  15     4
# 11 abinav   9     4
# 12  vinay  10     4
# 13  saran   9     5
# 14 abinav  15     5
# 15  vinay  10     5
# 16  saran   9     6
# 17  vinay  15     6
# 18 abinav  10     6
# 19  saran   9     7
# 20 abinav  15     7
# 21  vinay  10     7
# 22  vinay  10     8
# 23  saran   9     8
# 24 abinav  15     8
# 25  vinay  15     9
# 26 abinav  10     9
# 27  saran   9     9
# 28  vinay   9    10
# 29  saran  15    10
# 30 abinav  10    10

Data

df <- structure(list(name = c("abinav", "vinay", "saran"), sal = c(10L, 9L, 15L)), class = "data.frame", row.names = c(NA, -3L))

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2