'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 |
