R 对每个组随机采样,创建一个新的数据帧,重复,直到对组中的所有实体进行采样

R 对每个组随机采样,创建一个新的数据帧,重复,直到对组中的所有实体进行采样,r,subsampling,R,Subsampling,我想为每个区域随机选取一个站点,创建一个新的数据帧,并重复这些过程,直到对所有站点进行采样。因此,每个数据帧将不包含来自同一区域的同一站点 在我的真实数据框中,有几个区域的站点比其他区域多(区域C有4个站点)。我想删除这些行(也许在创建多个数据帧之前我应该这样做) 下面是一个示例数据帧(实际数据帧具有>100个区域和>10个站点/区域): 请您帮助我创建多个数据框,以便所有数据框包含所有区域,但每个数据框包含唯一的区域站点组合 编辑:这里是预期的输出。为了产生这些,在第一次抽样中,从每个区域随机

我想为每个区域随机选取一个站点,创建一个新的数据帧,并重复这些过程,直到对所有站点进行采样。因此,每个数据帧将不包含来自同一区域的同一站点

在我的真实数据框中,有几个区域的站点比其他区域多(区域C有4个站点)。我想删除这些行(也许在创建多个数据帧之前我应该这样做)

下面是一个示例数据帧(实际数据帧具有>100个区域和>10个站点/区域):

请您帮助我创建多个数据框,以便所有数据框包含所有区域,但每个数据框包含唯一的区域站点组合

编辑:这里是预期的输出。为了产生这些,在第一次抽样中,从每个区域随机抽取一个站点(行),并制作一个数据帧。在第二次采样中,重复相同的过程,但无法绘制给定区域的相同场地。我想要的是独立的数据帧,其中包含区域站点的唯一组合

V1 V2 Region Site
5 1 A X1
7 8 B X3
1 2 C X1

V1 V2 Region Site
5 6 A X2
3 1 B X2
4 5 C X3

V1 V2 Region Site
8 9 A X3
2 3 B X1
9 4 C X2

伟大的
data.table
包实际上让这变得非常简单

# Turn mydf into a data.table 
library(data.table)
setDT(mydf)

# Shuffle the rows of the table
dt <- dt[sample(.N)]

# In case there are multiple rows for a given Region <-> Site pair,
# eliminate duplicates.
dt <- unique(dt, by = c('Region', 'Site'))

# Get the first sample from each region group
# Note: .SD refers to the sub-tables after grouping by Region
dt[, .SD[1], by=Region]

# Get the second and third sample from each region group
dt[, .SD[2], by=Region]
dt[, .SD[3], by=Region]
#将mydf转换为data.table
库(数据表)
setDT(mydf)
#洗牌桌子上的几行

dt成功了!我看不到接受答案的复选标记,所以我在这里做。

关于R编码的问题在这里通常是离题的。我想这将是一个主题。如果您等待,我们可以尝试将其迁移到那里。很抱歉。感谢您尝试迁移它。您能显示预期的输出吗?也可以使用
unique
完成“消除重复项”步骤。关于后面的部分,可能只是
dt[,.SD[1:3],by=Region]
,因为OP只需要每个区域三个站点。作为旁注,我认为覆盖强调OP清晰性的
dt是一种不好的做法。还添加了一行。好的,很好的一行。顺便说一句,我只是想澄清一下<代码>dt
V1 V2 Region Site
5 1 A X1
7 8 B X3
1 2 C X1

V1 V2 Region Site
5 6 A X2
3 1 B X2
4 5 C X3

V1 V2 Region Site
8 9 A X3
2 3 B X1
9 4 C X2
# Turn mydf into a data.table 
library(data.table)
setDT(mydf)

# Shuffle the rows of the table
dt <- dt[sample(.N)]

# In case there are multiple rows for a given Region <-> Site pair,
# eliminate duplicates.
dt <- unique(dt, by = c('Region', 'Site'))

# Get the first sample from each region group
# Note: .SD refers to the sub-tables after grouping by Region
dt[, .SD[1], by=Region]

# Get the second and third sample from each region group
dt[, .SD[2], by=Region]
dt[, .SD[3], by=Region]
library(data.table)
dt <- setDT(mydf)
dt <- unique(dt, by = c('Region', 'Site'))
dt[sample(.N), .SD[1:3], by = Region]