我想为每个区域选择一个随机网站,创建一个新的数据框,然后重复这些过程,直到对所有网站进行采样。因此,每个数据框不会包含来自同一区域的同一网站。
我的实际数据框中的一些区域拥有的网站数量超过其他区域(区域C有4个网站)。我想删除那些行(也许我应该在制作多个数据帧之前执行此操作)。
以下是一个示例数据框(实际数据框有> 100个区域,每个区域有> 10个网站):
mydf <- read.table(header = TRUE, text = 'V1 V2 Region Site
5 1 A X1
5 6 A X2
8 9 A X3
2 3 B X1
3 1 B X2
7 8 B X3
1 2 C X1
9 4 C X2
4 5 C X3
6 7 C X4')
重复以下代码三次会生成包含给定Region的相同Sites的数据框(第二个和第三个表都包含A区的X2站点)。
do.call(rbind, lapply(split(mydf, mydf$Region), function(x) x[sample(nrow(x), 1), ]))
V1 V2 Region Site
A 8 9 A X3
B 2 3 B X1
C 6 7 C X4
V1 V2 Region Site
A 5 6 A X2
B 7 8 B X3
C 9 4 C X2
V1 V2 Region Site
A 5 6 A X2
B 3 1 B X2
C 6 7 C X4
您能帮我创建多个数据框,以便所有数据框都包含所有区域,但每个数据框都包含唯一的区域 - 站点组合。
编辑:这是预期的输出。为了生成这些,在第一次采样中,从每个区域随机绘制一个站点(行)并创建数据框。在第二次采样中,重复相同的过程,但不能绘制给定区域的相同站点。我想要的是包含Region-Site唯一组合的独立数据框。
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
答案 0 :(得分:0)
伟大的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]
事实上,正如弗兰克建议的那样,你可以组合成一个单行的
library(data.table)
dt <- setDT(mydf)
dt <- unique(dt, by = c('Region', 'Site'))
dt[sample(.N), .SD[1:3], by = Region]
答案 1 :(得分:0)
有效!我没有看到接受答案的复选标记,所以我在这里做。