R 从组中取样,仅在数据中保留唯一的观察结果

R 从组中取样,仅在数据中保留唯一的观察结果,r,random,dplyr,sample,R,Random,Dplyr,Sample,我希望每组抽取一个样本,同时避免任何参与者在样本中出现两次(我需要这个样本用于受试者之间的方差分析)。我有一个数据框,其中一些参与者(并非所有参与者)出现两次,每次出现在不同的组中,即Peter可以出现在组v1=a和v2=1中,但理论上也可以出现在组v1=B和v2=3中。一个组由两个变量v1和v2定义,因此根据下面的代码,有8个组 现在,我想避免任何参与者在数据中出现双重现象,即每组抽取样本,随机消除任何参与者的一个观察结果,同时保持相同大小的样本。我构建了以下丑陋的代码来展示我的问题 我如何完

我希望每组抽取一个样本,同时避免任何参与者在样本中出现两次(我需要这个样本用于受试者之间的方差分析)。我有一个数据框,其中一些参与者(并非所有参与者)出现两次,每次出现在不同的组中,即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)
df1<-数据帧(ID=c(“彼得”、“彼得”、“克里斯”、“约翰”、“乔治”、“乔治”、“诺曼”、“约瑟夫”、“简”、“简”、“理查德”、“理查德”、“保罗”、“克里斯蒂安”、“菲利克斯”、“菲利克斯”、“尼克”、“朱利叶斯”、“朱利叶斯”、“莫里茨”),
v1=代表(c(“A”、“B”),10),
v2=代表(c(1:4),5))
图书馆(dplyr)
df2%分组依据(v1,v2)%>%样本(2)

您可以首先根据“ID”采集尺寸为1的样本,然后根据“v1”和“v2”对U进行分组,然后再采集尺寸为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
库(dplyr)
种子(1)
df2%
分组依据(ID)%>%
样本n(1)%>%
分组依据(v1,v2)%>%
样本(2)
df2
#分组:v1、v2[4]
#ID v1 v2
#       
#保罗
#2001年1月2日
#诺曼A 3
#4理查德A 3
#5乔治B 2
#6彼得B 2
#7莫里茨B 4
#8菲利克斯B 4

下面的答案很好。另一种方法是随机排列data.frame,然后过滤掉重复项,例如,
df1[sample(1:nrow(df1)),]%%>%filter(!duplicated(ID))%%>%group…
谢谢。“set.seed(1)”命令有什么用途?我是否可以将其设置为另一个数字,即“set.seed(2)”?@JensStach不客气<代码>设置。种子可确保结果的可重复性,因为取样涉及随机性。是的,您可以将数字设置为例如2,但结果会有所不同。试试看。