分类变量中R中的随机抽样

Random sampling in R within Categorical variable

假设我有一个数据框,其分类变量为 n 类 和一个数值变量。我需要随机化每个类别中的数值变量。例如,考虑以下 table:

Col_1           Col_2      
   A               2        
   A               5           
   A               4           
   A               8        
   B               1   
   B               4        
   B               9          
   B               7       

当我在 R 中尝试 sample() 函数时,它抛出了考虑这两个类别的结果。有什么函数可以得到这种输出吗? (有无更换,无所谓)

Col_1           Col_2      
 A               8        
 A               4           
 A               2           
 A               5        
 B               9  
 B               7       
 B               4          
 B               1

这是一个 dplyr 解决方案:

library(dplyr)
set.seed(2)
dat %>%
  group_by(Col_1) %>%
  mutate(Col_2 = sample(Col_2)) %>%
  ungroup()
# # A tibble: 8 x 2
#   Col_1 Col_2
#   <chr> <int>
# 1 A         2
# 2 A         4
# 3 A         5
# 4 A         8
# 5 B         7
# 6 B         9
# 7 B         1
# 8 B         4

一个data.table方法:

library(data.table)
datDT <- as.data.table(dat)
set.seed(2)
datDT[, Col_2 := sample(Col_2), by = "Col_1"]
datDT
#    Col_1 Col_2
# 1:     A     2
# 2:     A     4
# 3:     A     5
# 4:     A     8
# 5:     B     7
# 6:     B     9
# 7:     B     1
# 8:     B     4

数据

dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
Col_1 Col_2
A 2
A 5
A 4
A 8
B 1
B 4
B 9
B 7")

您可以 sample 组内的行号。在 base R 中,我们可以使用 ave

df[with(df, ave(seq_len(nrow(df)), Col_1, FUN = sample)), ]

#  Col_1 Col_2
#2     A     5
#4     A     8
#1     A     2
#3     A     4
#7     B     9
#5     B     1
#8     B     7
#6     B     4

dplyr中,我们可以使用sample_n

library(dplyr)
df %>% group_by(Col_1) %>% sample_n(n())

数据

df <- structure(list(Col_1 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L), .Label = c("A", "B"), class = "factor"), Col_2 = c(2L, 5L, 
4L, 8L, 1L, 4L, 9L, 7L)), class = "data.frame", row.names = c(NA, -8L))