【发布时间】:2020-12-14 17:11:10
【问题描述】:
我有一个包含许多列的数据集,例如 2014 年 1 月降水的 1_2014_precip。这是两个数据集的合并。第一个是农艺变量,例如在给定年份收集的谷物产量。第二个是天气数据,它是在进行任何实验的整个时间段内下载的。所以我收集了一年的粮食产量,例如 2013 年,我目前有关于 2011-2019 年在该地点经历的天气的列。我想要一个数据集,其中只有与收集产量的年份相对应的数据。
该数据集涵盖所有 12 个月、7 个天气变量和 10 年。我想制作诸如2_mean_temp 之类的列,对应于二月份的平均温度,并使用列Year 告诉R 在哪里寻找正确的数据(所以如果Year 中的条目是2019,脚本将拉来自现有列2_2019_mean_temp 的新列2_mean_temp 的值。我包括两年内两个月内两个天气变量的数据示例,以了解我需要如何操作它。我已经想出了如何在 Python 中执行此操作,但出于工作流程的目的,我需要能够在 R 中执行此操作。我在 R 中的主要问题是我不知道如何告诉 R 根据给定列的值 - 如果没有自动化,我什至无法生成第一列。
dput(head(df))
structure(list(Experiment = c("IREE- N Rate", "IREE- N Rate",
"IREE- N Rate", "IREE- N Rate", "IREE- N Rate", "IREE- N Rate"),
Site = c("Waseca", "Waseca", "Waseca", "Waseca", "Waseca", "Waseca"),
Year = c(2013L, 2013L, 2013L, 2013L, 2014L, 2014L),
`1_2013_mean_temp` = c(-8.58677419354839, -8.58677419354839, -8.58677419354839, -8.58677419354839, -8.58677419354839, -8.58677419354839),
`1_2013_precip` = c(14.17, 14.17, 14.17, 14.17, 14.17, 14.17),
`1_2014_mean_temp` = c(-14.0787096774194, -14.0787096774194, -14.0787096774194, -14.0787096774194, -14.0787096774194, -14.0787096774194),
`1_2014_precip` = c(21.97, 21.97, 21.97, 21.97, 21.97, 21.97),
`2_2013_mean_temp` = c(-7.22428571428571, -7.22428571428571, -7.22428571428571, -7.22428571428571, -7.22428571428571, -7.22428571428571),
`2_2013_precip` = c(27.94, 27.94, 27.94, 27.94, 27.94, 27.94),
`2_2014_mean_temp` = c(-13.5003571428571, -13.5003571428571, -13.5003571428571, -13.5003571428571, -13.5003571428571, -13.5003571428571),
`2_2014_precip` = c(28.95, 28.95, 28.95, 28.95, 28.95, 28.95)), row.names = c(195L, 223L, 245L, 271L, 196L, 224L), class = "data.frame")
这就是我希望这个数据样本在被处理后的样子。请注意,列名中不再有年份,并且数据已从与相应年份匹配的相应列中移动(前四种情况下为 2013_month_variable,后两种情况下为 2014_month_variable)。
df2 <- data.frame(Experiment = c("IREE- N Rate", "IREE- N Rate", "IREE- N Rate", "IREE- N Rate", "IREE- N Rate", "IREE- N Rate"),
Site = c("Waseca", "Waseca", "Waseca", "Waseca", "Waseca", "Waseca"),
Year = c(2013, 2013, 2013, 2013, 2014, 2014),
1_mean_temp = c(-8.585774, -8.585774, -8.585774, -8.585774, -14.07871, -14.07871),
1_precip = c(14.17, 14.17, 14.17, 14.17, 21.97, 21.97),
2_mean_temp = c(-7.224286,-7.224286, -7.224286, -7.224286, -13.50036, -13.50036),
2_precip = c(27.94, 27.94, 27.94, 27.94, 28.95, 28.95))
这是我在 Python 中的做法。
months = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
variables = ['mean_temp', 'mean_max_temp', 'mean_min_temp', 'min_min_temp', 'mean_rh', 'precip', 'VPD']
years = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
for m in months:
for var in variables:
for year in years:
try:
df.loc[(df['Year'] == year), '_' + m + '_' + var] = df[m + '_' + year + '_' + var]
except:
print(year + '_' + m + '_' + var)
我可以在 R 中使用 for 循环重新创建列名,然后我就卡住了。我已经尝试在没有自动化的情况下执行此操作,但我似乎无法找到一种方法让 R 根据不同列的值来使 R 查询哪个列的值。
years <- list("2013", "2014")
months <- list("1", "2")
vars <- list("mean_temp", "precip")
for (year in years) (
for (month in months) (
for (var in vars) {
x = paste(year,"_", month,"_",var, sep="")
}
)
)
按年份重塑不会解决问题,因为它会创建诸如“2013_2011_1_mean_temp”之类的无意义的列,并且不会自动将天气数据连接到收集谷物的适当年份。
【问题讨论】:
-
reshape(unique(df), idvar=c("Experiment", "Site"), timevar="Year", direction="wide")呢? -
您的预期输出不清楚。
-
为什么即使不同年份的数据在不同的列中,原始数据集中还有
Year列? -
这是两个数据集的合并。第一个是农艺变量,例如在给定年份收集的谷物产量。第二个是天气数据,它是在进行任何实验的整个时间段内下载的。因此,如果我在 2013 年收集粮食产量,我目前有关于 2011-2019 年在该地点经历的天气的列。我想要一个数据集,其中只有与收集产量的年份相对应的数据。为了清楚起见,我会将其添加到帖子中。
-
我不希望重新调整数据 - 我希望它是长格式的,以便每个谷物产量观察都有一个条目。我只想合并天气数据,以便只保留收集谷物的年份。使用 Python,我生成了我所谓的“相对列”,然后在 R 中我删除了原始列。
标签: r