R 通过在每个区域随机抽样一个站点,但保留不同年份的行,对数据进行子集划分
这是来自的扩展qestion 从下面的示例数据中,我想通过从每个区域随机抽样一个站点来生成多个数据帧。若要制作另一个数据帧,请在不替换的情况下,对站点进行另一个随机抽样;也就是说,在任何先前的采样中采样的给定区域的同一站点不能被采样。因此,数据帧的数量将与区域内站点的数量一样多。我问题的这一部分在上面的链接中得到了回答(尽管我在该网站上找不到接受该答案的复选标记) 我这里的问题是关于我的另一个数据框架,它包含给定站点多年的数据。我希望每个数据框包含唯一的区域站点组合(在上面的链接中回答),但具有所有年份的数据。以下是一个示例数据(给定区域的年数和地点数存在一些差异): 我试图修改上面链接中提供的代码,但没有成功。这是我试过的代码R 通过在每个区域随机抽样一个站点,但保留不同年份的行,对数据进行子集划分,r,random,sampling,R,Random,Sampling,这是来自的扩展qestion 从下面的示例数据中,我想通过从每个区域随机抽样一个站点来生成多个数据帧。若要制作另一个数据帧,请在不替换的情况下,对站点进行另一个随机抽样;也就是说,在任何先前的采样中采样的给定区域的同一站点不能被采样。因此,数据帧的数量将与区域内站点的数量一样多。我问题的这一部分在上面的链接中得到了回答(尽管我在该网站上找不到接受该答案的复选标记) 我这里的问题是关于我的另一个数据框架,它包含给定站点多年的数据。我希望每个数据框包含唯一的区域站点组合(在上面的链接中回答),但具有
library(data.table)
dt <- setDT(mydf)
dt <- dt[sample(.N)]
dt <- unique(dt, by = c('Year','Region'))
dt[, .SD[1], by=c("Region","Year")]
库(data.table)
dt由于每个“区域/站点”组合没有重复的“年份”,在转换为“data.table”(setDT(mydf)
)后,按“区域”分组,我们sample
对“站点”的唯一的元素进行采样,得到行索引(.I
),其中采样元素等于“站点”,提取行索引($V1
),使用它来子集数据集的行
setDT(mydf)[mydf[, .I[Site ==sample(unique(Site), 1)], .(Region)]$V1]
# V1 V2 Region Site Year
#1: 5 1 A X1 2000
#2: 1 1 A X1 2001
#3: 3 1 B X2 2000
#4: 4 4 B X2 2001
#5: 1 2 C X1 2000
#6: 9 4 C X1 2001
如果我们需要复制它,我们可以使用replicate
setDT(mydf)
lst <- replicate(5, mydf[mydf[, .I[Site ==sample(unique(Site), 1)],
.(Region)]$V1], simplify = FALSE)
如何在不重新使用给定区域的相同站点的情况下重复此过程?我想创建多个独立的数据帧。@清崎更新了帖子。最好有一个data.frames的列表,而不是单个data.frame对象。Replicate()生成的数据帧包含相同的站点。是否有解决方案使给定区域的给定站点仅出现在一个数据帧中?@kiyoshisaki在这种情况下,示例
部分在一两次绘图后变得不相关。您能找出我为什么会出现此错误吗?[.data.table
(mydf,tmp,on=)中的错误。(区域、站点):找不到函数“”
setDT(mydf)[mydf[, .I[Site ==sample(unique(Site), 1)], .(Region)]$V1]
# V1 V2 Region Site Year
#1: 5 1 A X1 2000
#2: 1 1 A X1 2001
#3: 3 1 B X2 2000
#4: 4 4 B X2 2001
#5: 1 2 C X1 2000
#6: 9 4 C X1 2001
setDT(mydf)
lst <- replicate(5, mydf[mydf[, .I[Site ==sample(unique(Site), 1)],
.(Region)]$V1], simplify = FALSE)
setDT(mydf)
mydf1 <- copy(mydf)
lst1 <- vector("list", 3)
for(i in 1:3){
tmp <- mydf[, .(Site = sample(unique(Site), 1)), Region]
lst1[[i]] <- mydf[tmp, on = .(Region, Site)]
mydf <- mydf[mydf[tmp, Site != i.Site, on = .(Region)]]
}
lst1
#[[1]]
# V1 V2 Region Site Year
#1: 5 6 A X2 2000
#2: 2 2 A X2 2001
#3: 3 3 B X1 2000
#4: 2 3 B X1 2001
#5: 4 5 C X2 2000
#6: 6 7 C X2 2001
#[[2]]
# V1 V2 Region Site Year
#1: 5 1 A X1 2000
#2: 1 1 A X1 2001
#3: 7 8 B X3 2000
#4: 1 2 C X1 2000
#5: 9 4 C X1 2001
#[[3]]
# V1 V2 Region Site Year
#1: 8 9 A X3 2000
#2: 5 5 A X3 2001
#3: 3 1 B X2 2000
#4: 4 4 B X2 2001