我有一个数据框,我希望通过随机选择基于ID的spp == cat
25个ID和基于ID的25个ID来进行子集化spp == dog
.
这是我的示例数据:
ID spp category prop 1 cat small_mam 0.99 2 cat small_mam 0.8 2 cat birds 0.15 3 dog large_mam 1 4 dog med_mam 0.4 4 dog emu 0.6 10 dog med_mam 0.8 10 dog birds 0.2 12 dog reptiles 1 13 dog large_mam 1 14 dog large_mam 1 15 dog large_mam 1 27 cat birds 0.2 28 cat small_mam 1 29 cat small_mam 0.75 29 cat birds 0.25 30 cat small_mam 0.7 30 cat birds 0.2
spp的ID值是唯一的,这意味着cat和dog永远不会具有相同的ID值.ID范围从1到696但不一定是唯一的,这是因为ID最多可以由7个类别组成,因此每个物种随机分配25行不起作用.
这个问题背后的背景是我将使用包中的piankabio函数(pgirmess)绘制1000个25只猫和25只狗粪便的随机样本(UID =粪便ID号),用于饮食重叠的自助计算.
在此先感谢您的帮助.
我使用的是R版本3.1.3
使用data.table,您可以按如下方式执行:
library(data.table) subdf <- setDT(mydf)[, sample(ID, 5), by = spp]
在您提供的示例数据上,这给出了:
> subdf spp V1 1: cat 27 2: cat 30 3: cat 2 4: cat 28 5: cat 30 6: dog 10 7: dog 14 8: dog 12 9: dog 4 10: dog 15
如果你想保留所有列(我想你想要),你可以这样做:
subdf <- setDT(mydf)[, .SD[sample(.N, 5)], by = spp]
这使:
> subdf spp ID category prop 1: cat 29 small_mam 0.75 2: cat 1 small_mam 0.99 3: cat 2 birds 0.15 4: cat 30 small_mam 0.70 5: cat 28 small_mam 1.00 6: dog 14 large_mam 1.00 7: dog 15 large_mam 1.00 8: dog 13 large_mam 1.00 9: dog 10 birds 0.20 10: dog 4 med_mam 0.40
注意:出于解释原因,我使用了5的样本,因为示例数据集不足以绘制25的样本.
根据您的评论,您可以通过以下方式实现:
setDT(mydf) set.seed(4321) newdf <- mydf[mydf[, .(ID = sample(unique(ID), 5)), by = spp], on = c("spp", "ID")]
这使:
> newdf ID spp category prop 1: 27 cat birds 0.20 2: 29 cat small_mam 0.75 3: 29 cat birds 0.25 4: 2 cat small_mam 0.80 5: 2 cat birds 0.15 6: 1 cat small_mam 0.99 7: 28 cat small_mam 1.00 8: 14 dog large_mam 1.00 9: 13 dog large_mam 1.00 10: 15 dog large_mam 1.00 11: 4 dog med_mam 0.40 12: 4 dog emu 0.60 13: 12 dog reptiles 1.00
说明:mydf[, .(ID = sample(unique(ID), 5)), by = spp]
创建索引data.table,每个类别包含5个唯一ID spp
.那么你是一个连接上spp
与ID
您使用此索引data.table选择的部分mydf
与这些ID的.