如何基于给定降水数据集迭代生成向量所有组合的结果?
生成向量所有不同组合的实现方案(针对你的降水数据集)
没问题!我来帮你搞定这个向量组合的问题,先把你的数据集生成代码整理好,方便咱们后续测试:
set.seed(123) df <- data.frame( loc.id = rep(1:5, each = 80*3), year = rep(rep(2000:2002, each = 80), times = 5), daily.rain = runif(min = 0, max = 30, n = 80*5*3) ) library(dplyr) df.clim <- df %>% group_by(loc.id,year) %>% summarise(tot.rain = sum(daily.rain)) %>% ungroup() %>% group_by(loc.id) %>% summarise(mean.rain = mean(tot.rain)) df <- df %>% left_join(df.clim)
你的数据集包含5个地点、3年(2000-2002)的80天降水数据,还有衍生的年度总降水tot.rain和地点平均年降水mean.rain列。针对「迭代生成向量的所有不同组合」的需求,我分几种常见场景给你具体实现:
场景1:生成数据集中现有列的所有唯一组合
比如你想拿到loc.id(1-5)和year(2000-2002)的所有可能组合,用base R的expand.grid或者tidyverse的crossing都可以,后者会自动帮你去重并排序,输出更整洁:
# Base R 实现 comb_base <- expand.grid(loc.id = unique(df$loc.id), year = unique(df$year)) # Tidyverse 实现(推荐,输出更规整) library(tidyr) comb_tidy <- crossing(loc.id = unique(df$loc.id), year = unique(df$year))
这两种方式都会生成5×3=15种唯一组合,如果你需要其他列的组合,只要替换unique()里的列名就行。
场景2:生成自定义向量的所有组合
如果你的需求是生成任意自定义向量的组合(比如不是数据集中的列),同样可以用这两个函数:
# 自定义两个向量 vec_num <- c(1, 2, 3) vec_char <- c("A", "B") # 生成所有组合并命名列 custom_comb <- expand.grid( number = vec_num, character = vec_char )
运行后会得到3×2=6种组合的数据集,列名就是你指定的number和character。
场景3:迭代每个组合并处理数据
如果你需要针对每个组合做进一步计算(比如重新计算每个地点+年份的总降水量),可以用迭代工具来批量处理:
Tidyverse 风格(更直观易读)
library(purrr) library(dplyr) # 先把组合转换成列表格式,方便迭代 comb_list <- comb_tidy %>% split(seq(nrow(.))) # 迭代每个组合,计算对应分组的总降水量 result_list <- map(comb_list, function(comb) { df %>% filter(loc.id == comb$loc.id, year == comb$year) %>% summarise(tot.rain_calc = sum(daily.rain)) %>% bind_cols(comb) # 把组合信息(地点、年份)合并到结果里 }) # 把所有结果合并成一个数据框 result_df <- bind_rows(result_list)
Base R 风格
如果你习惯用base R,也可以用apply来实现:
# 把组合转换成矩阵格式 comb_matrix <- as.matrix(comb_base) # 迭代处理每一行组合 result_base <- apply(comb_matrix, 1, function(row) { loc <- as.integer(row[1]) yr <- as.integer(row[2]) tot_rain <- sum(df$daily.rain[df$loc.id == loc & df$year == yr]) data.frame(loc.id = loc, year = yr, tot.rain_calc = tot_rain) }) # 把结果合并成数据框 result_base_df <- do.call(rbind, result_base)
以上几种方案可以覆盖大多数生成向量组合的需求,你可以根据自己的习惯和具体需求选择合适的方式~
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

