从组中抽样,只保留数据中的独特观察

Sample from groups and only maintain unique observations in the data

我想每组取一个样本,同时避免任何参与者在样本中出现两次(我需要这个来进行受试者间方差分析)。我有一个数据框,其中一些参与者(不是全部)出现两次,每次都在不同的组中,即 Peter 可以出现在组 v1=A 和 v2=1 中,但理论上也出现在组 v1=B 和 v2=3 中。一个组由两个变量 v1 和 v2 定义,所以根据下面的代码,有 8 个组。

现在,我想通过每组抽取样本并从任何参与者中随机删除一个观察值来避免数据中任何参与者的双重出现,同时保持相似大小的样本。我构建了以下丑陋的代码来展示我的问题。

我如何完成最后一步,以便没有参与者在样本中出现两次,并且我在所有样本中只有独特的案例?

df1 < - data.frame(ID=c("peter","peter","chris","john","george","george","norman","josef","jan","jan","richard","richard","paul","christian","felix","felix","nick","julius","julius","moritz"),
              v1=rep(c("A","B"),10),
              v2=rep(c(1:4),5))

library(dplyr)
df2 <- df1 %>% group_by(v1,v2) %>% sample_n(2)

您可以先按照 'ID' 取一个大小为 1 的样本,然后 group_by 'v1' 和 'v2' 再取一个大小为 2 的样本。

library(dplyr)
set.seed(1)
df2 <- df1 %>% 
 group_by(ID) %>% 
 sample_n(1) %>% 
 group_by(v1, v2) %>% 
 sample_n(2)

df2
#   Groups:   v1, v2 [4]
#   ID      v1       v2
#   <fct>   <fct> <int>
# 1 paul    A         1
# 2 jan     A         1
# 3 norman  A         3
# 4 richard A         3
# 5 george  B         2
# 6 peter   B         2
# 7 moritz  B         4
# 8 felix   B         4