通过为每个区域随机抽样一个站点但保留不同年份

时间:2017-03-11 16:37:58

标签: r random sampling

这是来自Randomly sample per group, make a new dataframe, repeat until all entities within a group are sampled

的扩展问答

从下面的示例数据中,我想通过从每个区域随机抽样一个站点来生成多个数据帧。要制作另一个数据框,请另外随机抽取一个Site而不进行替换;也就是说,无法对在任何先前采样中采样的给定区域的相同站点进行采样。因此,将有与区域内的站点数量一样多的数据帧。我的问题的这一部分在上面的链接中得到了解答(虽然我找不到一个复选标记来接受该网站上的答案)。

我的问题是我的另一个数据框,它包含给定网站多年的数据。我希望每个数据框都包含唯一的Region-Site组合(在上面的链接中回答),但是包含来自所有年份的数据。以下是一个示例数据(给定区域的年数和站点存在一些差异):

mydf <- read.table(header = TRUE, text = 'V1 V2 Region Site Year
  5 1 A X1 2000
  1 1 A X1 2001
  5 6 A X2 2000
  2 2 A X2 2001
  8 9 A X3 2000
  5 5 A X3 2001
  3 3 B X1 2000
  2 3 B X1 2001
  3 1 B X2 2000
  4 4 B X2 2001
  7 8 B X3 2000
  1 2 C X1 2000
  9 4 C X1 2001
  4 5 C X2 2000
  6 7 C X2 2001')

以下是一些预期的数据框:

V1 V2 Region Site Year
5  1      A   X1 2000
1  1      A   X1 2001
3  1      B   X2 2000
4  4      B   X2 2001
1  2      C   X1 2000
9  4      C   X1 2001

V1 V2 Region Site Year
8  9      A   X3 2000
5  5      A   X3 2001
3  3      B   X1 2000
2  3      B   X1 2001
4  5      C   X2 2000
6  7      C   X2 2001

我尝试修改上面链接中提供的代码,但它不起作用。这是我试过的代码

library(data.table)
dt <- setDT(mydf)
dt <- dt[sample(.N)]
dt <- unique(dt, by = c('Year','Region'))
dt[, .SD[1], by=c("Region","Year")]

1 个答案:

答案 0 :(得分:1)

由于每个“地区/网站”组合没有重复的“年份”,转换为“data.table”(sample)后,按“地区”分组,我们unique { {1}}'Site'的元素,得到行索引(.I),其中采样元素等于'Site',提取行索引($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)

更新

如果我们需要移除已经发生的“网站”,那么在我们创建for {{{}}时,使用list循环更新原始数据集时只包含尚未采样的行1}}('lst1')每个'Region'采样'Site'

data.table