假设我有一个数据框,其中包含n个类别的分类变量和一个数字变量。我需要将每个类别中的数字变量随机化。例如,考虑下表:
Col_1 Col_2A2A 5A 4A 8B 1B 4B 9B 7
当我在R中尝试sample()函数时,它考虑了两个类别都抛出了结果。有什么函数可以得到这种输出? (有无替换都无所谓)
Col_1 Col_2A 8A 4A2A 5B 9B 7B 4B 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
行号
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