通过基于两列随机选择值来子集数据框

Subset a data frame by randomly selecting values based on two columns

我有一个数据框,我想通过随机选择基于 spp == cat 的 25 个 ID 值和基于 spp == dog.

的 25 个 ID 值来进行子集化

这是我的示例数据:

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 值是唯一的,这意味着猫和狗的 ID 值永远不会相同。 ID 范围从 1 到 696 但不一定是唯一的,这是因为 ID 最多可以由 7 个类别组成,因此每个物种随机子设置 25 行是行不通的。

这个问题背后的背景是,我将抽取 25 只猫和 25 只狗的粪便(UID = 粪便 ID 号)的 1000 个随机样本,使用 piankabio 函数在 bootstrap 中计算饮食重叠包(pgirmess)。

在此先感谢您的帮助。

我正在使用 R 版本 3.1.3

使用 你可以按如下方式进行:

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 到 select mydf 的部分与这些 ID。