如何用Tidyverse风格重写R语言双重循环的密度计算代码?
用Tidyverse重写的等效代码
以下是用tidyverse工具链(dplyr、tidyr)重写的代码,保留了原有的筛选逻辑,同时提升了可读性和代码效率:
library(tidyverse) set.seed(123) a_df <- data.frame( sample = sample(c("A","B", "C"), 50, replace=TRUE), type = paste0(sample(letters[1:3], 50, replace=TRUE), sample(letters[1:3],50, replace=TRUE)), area = sample(1:100, 50, replace=TRUE) ) targets <- c("ab", "bb") all_densities <- crossing(sample = unique(a_df$sample), target_type = targets) %>% left_join(a_df, by = "sample") %>% filter(grepl(target_type, type)) %>% # 替换为你的自定义筛选函数即可 group_by(sample, target_type) %>% summarise( density = n() / sum(area, na.rm = TRUE), .groups = "drop" ) %>% rename(type = target_type)
代码说明:
crossing():生成所有sample与target的组合,替代原双重循环的遍历逻辑,确保每个分组都被覆盖left_join():将组合表与原数据关联,保留所有需要计算的分组filter():执行类型筛选,原代码的grep用grepl替代(返回逻辑向量更符合dplyr风格),直接替换成你的自定义筛选函数即可group_by()+summarise():按sample和target分组计算密度,n()统计符合条件的行数,sum(area)计算对应面积总和rename():统一列名,和原输出结构保持一致
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

