从下面的示例数据中,我想通过从每个区域随机抽样一个站点来生成多个数据帧。要制作另一个数据框,请另外随机抽取一个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")]
答案 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