{"title": "R语言循环读取数据并计算小麦产量相关指标", "description": "本代码演示了如何使用R语言循环读取数据文件,并计算小麦产量相关指标,例如平均温度、总降雨量、生长度日和成熟时产量。", "keywords": "R语言, 数据分析, 小麦产量, 循环, 平均温度, 总降雨量, 生长度日, 成熟时产量", "content": "# 读取数据文件\n\n\n df \u003c- fread("E:/trainingdata/wheatOUTfile/75csv/Hebei_bazhou.csv")\n\n\n # 提取起始年份和结束年份\n\n\n start_year \u003c- 1981\n\n\n end_year \u003c- 2019\n\n\n # 创建一个空的结果数据框\n\n\n result \u003c- data.frame(Year = integer(), Avg_Temperature = numeric(), Total_Rainfall = numeric(), gdd = numeric(), yield_at_maturity = numeric())\n\n\n # 循环计算1981-2019年的结果\n\n\n for (year in start_year:end_year) {\n\n\n # 提取播种日期(day1)和成熟日期(day2)\n\n\n day1 \u003c- df %>%\n\n\n filter(year == year, StageName == "sowing") %>%\n\n\n select(simulation_days)\n\n\n \n\n\n day2 \u003c- df %>%\n\n\n filter(year == year+1, StageName == "maturity") %>%\n\n\n select(simulation_days)\n\n\n \n\n\n # 计算平均温度\n\n\n avg_temperature \u003c- df %>%\n\n\n filter(simulation_days >= day1[[1]] & simulation_days <= day2[[1]]) %>%\n\n\n summarize(Avg_Temperature = mean(MaxT, na.rm = TRUE))\n\n\n \n\n\n # 计算总降雨量\n\n\n total_rainfall \u003c- df %>%\n\n\n filter(simulation_days >= day1[[1]] & simulation_days <= day2[[1]]) %>%\n\n\n summarize(Total_Rainfall = sum(Rain, na.rm = TRUE))\n\n\n \n\n\n # 计算gdd\n\n\n gdd \u003c- df %>%\n\n\n filter(simulation_days >= day1[[1]] & simulation_days <= day2[[1]]) %>%\n\n\n summarize(gdd = sum((MaxT+MinT)/2, na.rm = TRUE))\n\n\n \n\n\n # 提取成熟时的产量\n\n\n yield_at_maturity \u003c- df %>%\n\n\n filter(year == year+1, StageName == "maturity") %>%\n\n\n select(yield)\n\n\n \n\n\n # 将结果添加到结果数据框中\n\n\n result \u003c- rbind(result, data.frame(Year = year, Avg_Temperature = avg_temperature$Avg_Temperature, Total_Rainfall = total_rainfall$Total_Rainfall, gdd = gdd$gdd, yield_at_maturity = yield_at_maturity$yield))\n\n\n }\n\n\n \n\n\n 为什么循环出来每年的结果都是第一年的内容:循环出来每年的结果都是第一年的是因为在循环中提取播种日期(day1)和成熟日期(day2)时,使用了"start_year"作为过滤条件,而没有更新为当前循环的年份"year"。因此,每次循环中提取的日期都是第一年的日期,导致计算平均温度、总降雨量、gdd和成熟时的产量时都是以第一年的数据为基准计算的。\n\n\n 要修正这个问题,需要在提取日期的代码中将"start_year"替换为"year",以使用当前循环的年份作为过滤条件。修改后的代码如下:\n\n\n R\n\n\n # 循环计算1981-2019年的结果\n\n\n for (year in start_year:end_year) {\n\n\n # 提取播种日期(day1)和成熟日期(day2)\n\n\n day1 \u003c- df %>%\n\n\n filter(year == year, StageName == "sowing") %>%\n\n\n select(simulation_days)\n\n\n \n\n\n day2 \u003c- df %>%\n\n\n filter(year == year+1, StageName == "maturity") %>%\n\n\n select(simulation_days)\n\n\n \n\n\n # 计算平均温度\n\n\n avg_temperature \u003c- df %>%\n\n\n filter(simulation_days >= day1[[1]] & simulation_days <= day2[[1]]) %>%\n\n\n summarize(Avg_Temperature = mean(MaxT, na.rm = TRUE))\n\n\n \n\n\n # 计算总降雨量\n\n\n total_rainfall \u003c- df %>%\n\n\n filter(simulation_days >= day1[[1]] & simulation_days <= day2[[1]]) %>%\n\n\n summarize(Total_Rainfall = sum(Rain, na.rm = TRUE))\n\n\n \n\n\n # 计算gdd\n\n\n gdd \u003c- df %>%\n\n\n filter(simulation_days >= day1[[1]] & simulation_days <= day2[[1]]) %>%\n\n\n summarize(gdd = sum((MaxT+MinT)/2, na.rm = TRUE))\n\n\n \n\n\n # 提取成熟时的产量\n\n\n yield_at_maturity \u003c- df %>%\n\n\n filter(year == year+1, StageName == "maturity") %>%\n\n\n select(yield)\n\n\n \n\n\n # 将结果添加到结果数据框中\n\n\n result \u003c- rbind(result, data.frame(Year = year, Avg_Temperature = avg_temperature$Avg_Temperature, Total_Rainfall = total_rainfall$Total_Rainfall, gdd = gdd$gdd, yield_at_maturity = yield_at_maturity$yield))\n\n\n }\n\n\n \n\n\n 现在,每年的结果应该对应相应年份的数据了。


原文地址: https://www.cveoy.top/t/topic/pDO9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录