簡體   English   中英

通過基於兩列隨機選擇值來子集數據幀

[英]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值是唯一的,這意味着cat和dog永遠不會具有相同的ID值。 ID范圍從1到696但不一定是唯一的,這是因為ID最多可以由7個類別組成,因此每個物種隨機分配25行不起作用。

這個問題背后的背景是我將使用包中的piankabio函數(pgirmess)繪制1000個25只貓和25只狗糞便的隨機樣本(UID =糞便ID號),用於飲食重疊的自助計算。

在此先感謝您的幫助。

我使用的是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]可以為每個spp類別創建一個索引data.table,其中包含5個唯一ID。 然后在sppID上進行連接,使用此index-data.table選擇具有這些ID的mydf部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM