[英]R: Subset Large Data Frame with Multiple Conditions
我有一個包含 1200 萬行和 5 列的大型數據框。 我想對具有多個條件的大型數據框進行子集化。 我需要使用不同的條件多次執行此操作,因此我創建了一個查找表和一個 for 循環。
下面的代碼循環遍歷大型數據幀並對其進行子集化,將每次迭代保存為列表中的列表。 循環完成后,我將列表組合成一個數據框。
我當前的設置功能,但速度非常慢(8 個循環大約需要 15 分鍾)。 子集實際上比計算 1200 萬行表的平均值和 SD 所花費的時間更多!
關於如何加快速度的任何建議?
>scaled
| chr | site | Average_CPMn | SD_CPMn |
|------|------|--------------|---------|
| chrI | 1 | 0.071 | 0.070 |
| chrI | 2 | 0.120 | 0.111 |
| chrI | 3 | 0.000 | 0.000 |
| chrI | 4 | 0.000 | 0.000 |
| chrI | 5 | 0.000 | 0.000 |
| chrI | 6 | 0.156 | 0.056 |
...12,000,000 rows
>genes.df
| Gene | Chromosome | Meta_Start | Meta_Stop |
|---------|------------|------------|-----------|
| YGL234W | chrVII | 55982 | 59390 |
| YGR061C | chrVII | 611389 | 616465 |
| YMR120C | chrXIII | 507002 | 509780 |
| YLR359W | chrXII | 843782 | 846230 |
scaled <- read_rds("~/Desktop/scaled.rds")
subset_list = list()
for (i in 1:nrow(genes.df)) {
subset <- scaled %>%
dplyr::filter(chr == genes.df$Chromosome[i] & site >= genes.df$Meta_Start[i] & site <= genes.df$Meta_Stop[i]) %>%
dplyr::mutate(Gene = genes.df$Gene[i])
subset_list[[i]] <- subset
#combine gene-list into single dataframe
counts_subset <- as.data.frame(do.call(rbind, subset_list)) %>%
left_join(genes.df, by = "Gene")
您沒有共享數據/樣本,因此很難演示,但是,建議在tidyverse
中使用semi_join
(如果您只想進行子集化)或left_join
(如果想要變異)有點像這樣
scaled %>% semi_join(genes.df %>% pivot_longer(c(Meta_start, Meta_stop)) %>%
group_by(Gene, Chromosome) %>%
complete(value = seq(min(value), max(value), 1)) %>%
ungroup %>% select(-name), by = c('chr' = 'Chromosome', 'site' = 'value'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.