提问者:小点点

采样不同的x和不同的样本量R


假设我有一张这样的表:

我想从数据框中的每个学生那里获取不同样本大小的设备#样本。

例如,我想要学生“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)

}

共2个答案

匿名用户

您可以创建一个数据帧,其中包含学生信息和要采样的行。联接数据并使用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)

实际上,这是解决这个问题的一个更加优雅和通用的方法。