假设我有一张这样的表:
我想从数据框中的每个学生那里获取不同样本大小的设备#样本。
例如,我想要学生“A”的1个设备#,学生“B”的2个,学生“C”的3个。如何在R中实现这一点?
这是我现在拥有的代码,但我只从每个学生那里打印了 1 个设备 #。
students <- unique(df$`Students`)
sample_size <- c(1,2,3)
for (i in students){
s <- sample(df[df$`Students` == i,]$`Equipment #`, size = sample_size, replace = FALSE)
print(s)
}
您可以创建一个数据帧,其中包含学生信息和要采样的行。联接数据并使用sample_n
对这些行进行采样。
library(dplyr)
sample_data <- data.frame(Students = c('A', 'B', 'C'), nr = 1:3)
df %>%
left_join(sample_data, by = 'Students') %>%
group_by(Students) %>%
sample_n(first(nr)) %>%
ungroup() %>%
select(-nr) -> s
s
# Students Equipment
# <chr> <int>
#1 A 102
#2 B 108
#3 B 105
#4 C 110
#5 C 112
#6 C 111
你很接近。您需要使用循环为sample_size
向量编制索引,否则每次迭代时,它只会占用向量中的第一项。
library(dplyr)
# set up data
df <- data.frame(Students = c(rep("A", 3),
rep("B", 5),
rep("C", 4)),
Equipment_num = 101:112)
# create vector of students
students <- df %>%
pull(Students) %>%
unique()
# sample and print
for (i in seq_along(students)) {
p <- df %>%
filter(Students == students[i]) %>%
slice_sample(n = i)
print(p)
}
#> Students Equipment_num
#> 1 A 102
#> Students Equipment_num
#> 1 B 107
#> 2 B 105
#> Students Equipment_num
#> 1 C 109
#> 2 C 110
#> 3 C 112
创建于 2021-08-06 由 reprex 软件包 (v2.0.0)
实际上,这是解决这个问题的一个更加优雅和通用的方法。