通过基于两列随机选择值来子集数据框
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
使用 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 到 select mydf
的部分与这些 ID。
我有一个数据框,我想通过随机选择基于 spp == cat
的 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 值是唯一的,这意味着猫和狗的 ID 值永远不会相同。 ID 范围从 1 到 696 但不一定是唯一的,这是因为 ID 最多可以由 7 个类别组成,因此每个物种随机子设置 25 行是行不通的。
这个问题背后的背景是,我将抽取 25 只猫和 25 只狗的粪便(UID = 粪便 ID 号)的 1000 个随机样本,使用 piankabio 函数在 bootstrap 中计算饮食重叠包(pgirmess)。
在此先感谢您的帮助。
我正在使用 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 到 select mydf
的部分与这些 ID。