如何高效实现按Block分组的数据透视并生成列表?
高效实现按Block分组的宽表透视并生成列表
针对你的需求,无需手动逐个处理Block,以下两种高效方法可以快速实现目标:
方法1:tidyverse工具链(代码直观易读)
利用dplyr分组统计频数,tidyr转宽表,最后拆分生成列表:
library(dplyr) library(tidyr) # 分组统计+转宽表+生成列表 result_list <- df %>% # 统计每个Block内Species-date的出现次数 group_by(Block, Species, date) %>% summarise(count = n(), .groups = "drop_last") %>% # 转宽表,缺失组合填充0 pivot_wider(names_from = date, values_from = count, values_fill = 0) %>% # 按Block拆分,去掉Block列 group_split(Block, .keep = FALSE) %>% # 给列表元素命名为对应的Block setNames(unique(df$Block))
方法2:data.table(大数据集首选,效率更高)
如果你的数据集规模较大,data.table的分组和透视操作性能更优:
library(data.table) setDT(df) # 统计频数+透视+按Block拆分列表 result_list <- df[, .N, by = .(Block, Species, date)] %>% dcast(Species ~ date, value.var = "N", fill = 0) %>% split(by = "Block", keep.by = FALSE)
运行任意一种方法后,result_list就是你需要的结构:每个列表元素对应一个Block的宽表,行是物种,列是日期,值为该物种在对应日期的出现次数(无出现则为0)。
内容的提问来源于stack exchange,提问作者Amanda Goldberg
相关产品推荐
相关产品推荐

