在R中的列表对象中添加年份列并重塑数据

icomxhvb  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(102)

我正面临着以下问题。我使用特拉华州大学的气温数据(可以在这里找到@http://climate.geog.udel.edu/~climate/html_pages/download.html-在以下标题地面气温下:1900-2017网格化月度时间序列(V 5.01))。它以固定宽度格式提供年度数据,文件命名约定如下:air_temp.1900,air_temp.1901 air_temp.1902...... air_temp.2017.
从这些数据中,我使用以下代码提取数据作为 Dataframe ,制作2005- 15年的数据列表。

#list all files in the folder

p <- paste0("air_temp", sep= ".", 2005:2015)

#make a function to extract data from Uni_Del files
read_udel = function(p){
  d = read.fwf(p, widths=rep(8,15))
  names(d) = c("long","lat",month.abb,"mean")
  return(d)
}

#Make a list of that contains all data
read.all = lapply(p, read_udel)

每年的数据以以下格式发布:

lat | long | jan | feb| ........Dec| Mean

现在我想使用lat和long作为ID变量将每年的数据转换为long格式。但我面临的两个问题如下:
1.在所有年份的数据框中缺少年份的列,我无法弄清楚如何将其添加到对应于该年份观测的每个数据框中。
1.我不知道如何迭代列表中包含的所有数据框,以便一次性将每年的数据从宽更改为长(而无需逐个单独执行)
我需要以下格式的每年数据:

lat | long | year| month | air_temp
 x      y   1900     Jan     ..... (some value)
 x      y   1900     Feb     .....
 x      y   1900     March   .....

有没有人能帮我这个忙?非常感谢!!

uyto3xhc

uyto3xhc1#

要创建年份列,我建议您修改自定义函数:

read_udel = function(p){
  d = read.fwf(p, widths=rep(8,15))
  names(d) = c("long","lat",month.abb,"mean")
  d$year <- stringi::stri_extract_all(p, regex="\\d+")
  return(d)
}

我不能尝试它,请让我知道如果它的工作
为了将列表中的所有 Dataframe 从宽到长进行更改,我可以想象一种lapply与您最喜欢的整形函数相结合?(例如dplyr::pivot_longer等)。

相关问题