r - R:具有多个条件的子集大数据框
问题描述
我有一个包含 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")
解决方案
您没有共享数据/样本,因此很难演示,但是,建议使用semi_join
(如果您只想子集)或left_join
(如果想改变)有点像这样tidyverse
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'))
推荐阅读
- graphql - 基于 GraphQL Param 更改后端服务
- reactjs - react js和yii2如何一起使用
- php - PHP - 通过具有复杂功能的提供者对数组列表进行排序
- python-pptx - 通过 PPTX 访问拼写检查
- docx4j - 与 docx4j 的富文本内容控件数据绑定
- javascript - 在滑动时反应选择多个元素?
- f# - F# Deedle 将 Frame 保存到 MySql 数据库
- javascript - 与 inferno 相比,Svelte 的“评估脚本”时间似乎更长,preact
- reactjs - 出现错误:“您在预期流的位置提供了一个无效对象”,而没有 react-native 调试器
- javascript - React 函数的行为不像预期的那样