如何使用R的dataframe查找表标准化嵌套列表内的径流数据
问题修复方案
核心问题原因
原有两层lapply仅向自定义函数传入了子流域对应的径流数据框,未传递当前迭代对应的模型编号、子流域编号两个匹配关键字段,无法从查找表中定位到对应的Q_mean值。
修复代码(base R 版本,无需额外安装包)
# 遍历外层模型(i对应模型编号) testresult <- lapply(seq_along(Flowtestlist), function(model_idx) { # 遍历内层子流域(sub_name对应子流域编号) lapply(names(Flowtestlist[[model_idx]]), function(sub_name) { # 从查找表匹配对应Q_mean target_mean <- FlowtestDF$Q_mean[FlowtestDF$test_model == model_idx & FlowtestDF$test_subbasin == as.integer(sub_name)] # 计算标准化径流 tmp_df <- Flowtestlist[[model_idx]][[sub_name]] tmp_df$Q_st <- tmp_df$Q / target_mean return(tmp_df) }) |> setNames(names(Flowtestlist[[model_idx]])) # 保留原有子流域名称结构 })
修复代码(purrr 版本,代码更简洁易读)
library(purrr) testresult <- imap(Flowtestlist, function(sub_list, model_idx) { imap(sub_list, function(df, sub_name) { target_mean <- FlowtestDF$Q_mean[FlowtestDF$test_model == as.integer(model_idx) & FlowtestDF$test_subbasin == as.integer(sub_name)] df$Q_st <- df$Q / target_mean return(df) }) })
结果说明
运行后输出的testresult会完全保留原有的嵌套列表结构,每个子流域的数据框内会新增Q_st列,存储标准化后的径流值,匹配逻辑完全对应查找表的模型、子流域维度。
内容的提问来源于stack exchange,提问作者Joanna OK
相关产品推荐
相关产品推荐

