gpt4 book ai didi

r - 如何根据 R 中现有列的值和名称创建新列?

转载 作者:行者123 更新时间:2023-12-03 20:02:25 26 4
gpt4 key购买 nike

我有一个包含许多列的数据集,例如 1_2014_precip 2014 年 1 月降水量。这是两个数据集的合并。第一个是农艺变量,例如在给定年份收集的 Cereal 产量。第二个是天气数据,它是在进行任何实验的整个时间段内下载的。所以我收集了一年的粮食产量,例如 2013 年,我目前有关于该地点在 2011-2019 年经历的天气的列。我想要一个数据集,其中我只有与收集产量的年份相对应的数据。
该数据集跨越所有 12 个月、7 个天气变量和 10 年。我想做2_mean_temp之类的专栏,对应于 2 月平均温度,并使用列 Year告诉 R 在哪里寻找正确的数据(因此,如果 Year 中的条目是 2019,则脚本将从现有列 2_mean_temp 中提取新列的值 2_2019_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="")
}
)
)
按年份 reshape 不会解决问题,因为它会创建像“2013_2011_1_mean_temp”这样的无意义列,并且不会自动将天气数据连接到收集 Cereal 的适当年份。

最佳答案

我相信这是您正在寻找的结果;此解决方案使用 tidyverse 函数。

library(tidyverse)

# create empty tibble to store results
df.out <- tibble()

# loop over years
for (i in unique(df$Year)) {

this.year <- df %>%
# grab number of rows for this year
filter(Year == i) %>%
# only grab the weather columns for this specific year
select(Experiment, Site, Year, contains(paste0("_", i, "_"))) %>%
# this function uses a regex to rename columns with "_" and the current year by removing the part of the name with "_" then 4 numbers
rename_with(function(x) {str_replace(x, "\\_[0-9][0-9][0-9][0-9]", "")}, contains(paste0("_", i, "_")))

# add this year to your output tibble
df.out <- df.out %>%
bind_rows(this.year)

}
final data frame

关于r - 如何根据 R 中现有列的值和名称创建新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65293362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com