繁体   English   中英

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

[英]Random sampling in R within Categorical variable

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

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

您可以对组内的行号进行sample 在基础 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))

这是一个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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM