R:将值填充到列中,作为另一个 Dataframe 中所选列的平均值(步长= 12)

6za6bjd0  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(109)

我有一个数据框架,其中包含1980年1月到1990年12月的气候数据观测结果。数据集如下所示:

我的目标是得到一个数据集,其中前4列与我的原始数据集相同,其余为所有年份的月平均值。

由于每个月的平均值计算为以下各项的平均值(all of)每12列,我大概使用列索引除以12的模式,而公共模式定义了用于计算的列,例如,对于一月份的值,tave 01,新 Dataframe 中的值由来自索引/12的模式= 5的原始 Dataframe 的所有列计算。
有谁知道怎么做吗?我写了下面的代码来构建原始 Dataframe 和我想要的 Dataframe 的框架:

df_original <- data.frame(matrix(,nrow = 155, ncol = 484))
colnames(df_original)[1:10] <- c('ID','latitude','longitude','elevation','198001','198002','198003','198004','198005','198006') #original dataset, the variable names are months from 1980-01 to 1990-12. 
col_ind <- seq(5,length(colnames(tave)));col_ind #sequence of column indecies

df_new <- data.frame(matrix(,nrow = nrow(df_original), ncol = 16)) #empty new dataframe
df_new[,1:4] <- df_original[,1:4]
colnames(df_new) <- c('ID','latitude','longitude','elevation','tave01','tave02','tave03','tave04','tave05','tave06','tave07','tave08','tave09','tave10','tave11','tave12')
qf9go6mv

qf9go6mv1#

这里有一种方法,我将标题名称转换为年和月列,然后取每个月的位置平均值,并再次重新调整宽度。

library(tidyverse)
df_original %>%
  pivot_longer(-c(1:4)) %>%
  separate(name, c("year", "month"), sep = 4) %>%
  group_by(ID, latitude, longitude, elevation, month) %>%
  summarize(avg = mean(value), .groups = "drop") %>%
  pivot_wider(names_from = month, names_glue = "tave{month}", values_from = avg)

结果

# A tibble: 1 × 16
  ID    latitude longitude elevation tave01 tave02 tave03 tave04 tave05 tave06 tave07 tave08 tave09 tave10 tave11 tave12
  <lgl> <lgl>    <lgl>     <lgl>      <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 NA    NA       NA        NA            NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA

相关问题