[英]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.