簡體   English   中英

基於多條件向量的隨機抽樣R

[英]Random sampling based on vector with multiple conditions R

我有一個大型 dataframe SYN_data 有 150000 行和 3 列名為 SNP、基因和計數。有一個列表 r 有 2545 個計數值,其中還包括一些重復項。 現在我需要從 SYN_data 中隨機抽樣 2545 行而不替換,其計數值與列表 r 中的相似。 通過使用以下代碼,我可以成功地做到這一點:

test1 <- SYN_data[ sample( which( SYN_data$count %in% r ) , 2545 ) , ]

第二個條件是Genes的唯一長度應該是1671,總共2545行,意味着一些Genes有超過1個SNP。 有什么方法可以將此條件合並到相同的代碼中,或者滿足所有條件的任何其他代碼都會非常有幫助。 謝謝!

樣本數據:

# list
r 
> 1,7,3,14,9

SYN_data$SNP <- c('1- 10068526', '1- 10129891', '1- 10200104', 
                  '1- 10200491', '1- 10470141', '1- 10671598')

SYN_data$Gene <- c('AT1G28640', 'AT1G29030', 'AT1G29180', 
                   'AT1G29180', 'AT1G29900', 'AT1G30290')

SYN_data$count <- c('14',  '9',  '3',  '3',  '7',  '1')

一種可能的方法是首先對 1671 個獨特的基因進行采樣,將數據集子集到共享這些基因並在r集中計數的那些。 這是data.table中這種方法的實現:

#had to create some dummy data as not clear what the data is like
set.seed(0L)
nr <- 15e4
nSNP <- 1e3 
nGene <- 1e4
ncount <- 1:14     
r <- c(1,3,7,9,14)
SYN_data <- data.table(SNP=sample(nSNP, nr, TRUE),
    Gene=sample(nGene, nr, TRUE), count=sample(ncount, nr, TRUE))

ncnt <- 2545
ng <- 1671

#sample 1671 genes
g <- SYN_data[, sample(unique(Gene), ng)]    

#subset and sample the dataset
ix <- SYN_data[Gene %in% g & count %in% r, sample(.I, 1L), Gene]$V1
ans <- rbindlist(list(
    SYN_data[ix],
    SYN_data[-ix][Gene %in% g & count %in% r][, .SD[sample(.I, ncnt - ng)]]))
ans[, uniqueN(Gene)]
#1662 #not enough Gene in this dummy dataset

output:

      SNP Gene count
   1: 816 1261    14
   2:   7 8635     1
   3: 132 7457     1
   4:  22 3625     3
   5: 396 7640     7
  ---               
2534: 423 6387     3
2535: 936 3908     7
2536: 346 9654    14
2537: 182 7492     3
2538: 645  635     1

嘗試使用以下內容:

library(dplyr)

no_of_rows <- 2545
no_of_unique_gene <- 1671
temp <- SYN_data

while(n_distinct(temp$Gene) != no_of_unique_gene) {
  gene <- sample(unique(SYN_data$Gene),no_of_unique_gene)
  temp <- SYN_data[SYN_data$V23 %in% unique(r) & SYN_data$Gene %in% gene, ]
}
part1  <- temp %>% group_by(Gene) %>% sample_n(floor(no_of_rows/no_of_unique_gene))
part2 <- temp %>% anti_join(part1) %>% sample_n(no_of_rows - nrow(part1)) 
final <- bind_rows(part1, part2)

現在檢查length(unique(final$Gene))

暫無
暫無

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

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