Il y a deux ans (2011 et 2012) d'informations dans mes données. Je veux rassembler les mêmes années que celles indiquées dans la partie sortie. Et je veux la sortie sous forme de dataframe comme indiqué ci-dessous.
Voici mes exemples de données qui contiennent différentes années;
output<-structure(list(`2011` = c(0.266, 0.532, 0.797, 1.092, 1.27, 1.27,
1.27, 1.46, 1.46, 2.34, 2.53, 2.53, 2.53, 2.53), `2012` = c(0.955,
1.683, 2.398, 4.539, 6.528, 9.427, 10.848, 9.543, 13.736, 16.635,
16.751, 16.751, 16.751, 16.751)), class = "data.frame", row.names = c("m5",
"m10", "m15", "m30", "h1", "h2", "h3", "h4", "h5", "h6", "h8",
"h12", "h18", "h24"))
Et la structure de l'exemple de données:
2011 2012
m5 0.266 0.955
m10 0.532 1.683
m15 0.797 2.398
m30 1.092 4.539
h1 1.270 6.528
h2 1.270 9.427
. .
Voici la sortie souhaitée;
data<-list(`01-2011` = structure(c(0.266, 0.532, 0.797, 1.092, 1.27,
1.27, 1.27, 1.46, 1.46, 2.34, 2.53, 2.53, 2.53, 2.53), .Dim = c(14L,
1L), .Dimnames = list(c("m5", "m10", "m15", "m30", "h1", "h2",
"h3", "h4", "h5", "h6", "h8", "h12", "h18", "h24"), NULL)), `02-2011` = structure(c(0.955,
1.683, 2.398, 4.539, 6.528, 9.427, 10.848, 9.543, 13.736, 16.635,
16.751, 16.751, 16.751, 16.751), .Dim = c(14L, 1L), .Dimnames = list(
c("m5", "m10", "m15", "m30", "h1", "h2", "h3", "h4", "h5",
"h6", "h8", "h12", "h18", "h24"), NULL)), `01-2012` = structure(c(1.224,
2.395, 3.063, 5.131, 7.112, 9.474, 9.474, 10.302, 10.744, 9.474,
12.49, 11.406, 13.571, 13.919), .Dim = c(14L, 1L), .Dimnames = list(
c("m5", "m10", "m15", "m30", "h1", "h2", "h3", "h4", "h5",
"h6", "h8", "h12", "h18", "h24"), NULL)), `03-2012` = structure(c(0.75,
1.391, 1.871, 3.649, 5.174, 6.275, 6.439, 8.396, 6.963, 10.453,
8.844, 10.453, 10.901, 10.901), .Dim = c(14L, 1L), .Dimnames = list(
c("m5", "m10", "m15", "m30", "h1", "h2", "h3", "h4", "h5",
"h6", "h8", "h12", "h18", "h24"), NULL)))
Et la structure de la sortie souhaitée; $`01-2011`
[,1]
m5 0.266
m10 0.532
m15 0.797
m30 1.092
h1 1.270
h2 1.270
h3 1.270
h4 1.460
h5 1.460
h6 2.340
h8 2.530
h12 2.530
h18 2.530
h24 2.530
$`02-2011`
[,1]
m5 0.955
m10 1.683
m15 2.398
m30 4.539
h1 6.528
h2 9.427
h3 10.848
h4 9.543
h5 13.736
h6 16.635
h8 16.751
h12 16.751
h18 16.751
h24 16.751
$`01-2012`
[,1]
m5 1.224
m10 2.395
m15 3.063
m30 5.131
h1 7.112
h2 9.474
h3 9.474
h4 10.302
h5 10.744
h6 9.474
h8 12.490
h12 11.406
h18 13.571
h24 13.919
$`03-2012`
[,1]
m5 0.750
m10 1.391
m15 1.871
m30 3.649
h1 5.174
h2 6.275
h3 6.439
h4 8.396
h5 6.963
h6 10.453
h8 8.844
h12 10.453
h18 10.901
h24 10.901
3 Réponses :
Voici une solution avec dplyr , purrr , tidyr et lubridate .
Vous avez deux colonnes pour chaque année, mais votre sortie souhaitée n'a qu'une seule colonne pour chaque année, j'ai donc pris la moyenne des deux mois. Si vous préférez une autre fonction de synthèse, modifiez simplement summary (mean = mean (V1)) comme une autre opération.
library(dplyr)
library(purrr)
library(tidyr)
library(lubridate)
map(data,~ rownames_to_column(as.data.frame(.x))) %>%
bind_rows(.,.id= "date") %>%
mutate(date = as.Date(paste0("01-", date),format = "%d-%m-%Y")) %>%
mutate(year = year(date)) %>%
group_by(year,rowname) %>%
summarize(mean = mean(V1)) %>%
pivot_wider(id_cols = "rowname", names_from = "year",values_from = "mean")
# rowname `2011` `2012`
# <chr> <dbl> <dbl>
# 1 h1 3.90 6.14
# 2 h12 9.64 10.9
# 3 h18 9.64 12.2
# 4 h2 5.35 7.87
# 5 h24 9.64 12.4
# 6 h3 6.06 7.96
# 7 h4 5.50 9.35
# 8 h5 7.60 8.85
# 9 h6 9.49 9.96
#10 h8 9.64 10.7
#11 m10 1.11 1.89
#12 m15 1.60 2.47
#13 m30 2.82 4.39
#14 m5 0.610 0.987
library(dplyr)
library(tidyr)
library(purrr)
data_df <- as.data.frame(data)%>%
tibble::rownames_to_column(var = "var") %>%
pivot_longer(cols = -var, names_to = "Year") %>%
mutate(Year = stringr::str_extract(Year, "\\d{4}$")) %>%
group_by(var, Year) %>%
summarise(value = mean(value, na.rm = TRUE)) %>%
pivot_wider(id_cols = -value, names_from = Year, values_from = value) %>%
ungroup()
Un inconvénient de cette approche est qu'elle échouera si chaque élément de la liste n'a pas le même nombre ou les mêmes lignes.
Voici une méthode où nous divisons les données en une liste de data.frame en utilisant la sous-chaîne du noms de la liste , puis boucle sur la liste , cbind les éléments internes de la liste , obtenir le rowMeans et cbind la list
sapply(split(data, substring(names(data), 4)),
function(x) rowMeans(do.call(cbind, x)))
# 2011 2012
#m5 0.6105 0.9870
#m10 1.1075 1.8930
#m15 1.5975 2.4670
#m30 2.8155 4.3900
#h1 3.8990 6.1430
#h2 5.3485 7.8745
#h3 6.0590 7.9565
#h4 5.5015 9.3490
#h5 7.5980 8.8535
#h6 9.4875 9.9635
#h8 9.6405 10.6670
#h12 9.6405 10.9295
#h18 9.6405 12.2360
#h24 9.6405 12.4100
Ou la même chose dans base R , nous divisons les données comme ci-dessus, boucle sur la liste avec sapply , récupérons le rowMeans code> des éléments cbind ed inner list
library(dplyr) library(purrr) split(data, substring(names(data), 4)) %>% map(~ do.call(cbind, .x) %>% rowMeans) %>% do.call(cbind, .) # 2011 2012 #m5 0.6105 0.9870 #m10 1.1075 1.8930 #m15 1.5975 2.4670 #m30 2.8155 4.3900 #h1 3.8990 6.1430 #h2 5.3485 7.8745 #h3 6.0590 7.9565 #h4 5.5015 9.3490 #h5 7.5980 8.8535 #h6 9.4875 9.9635 #h8 9.6405 10.6670 #h12 9.6405 10.9295 #h18 9.6405 12.2360 #h24 9.6405 12.4100
REMARQUE: les deux solutions affichent le même résultat que les autres solutions
J'ai voté pour l'interrogateur.
Cette question n'est pas claire, manque de détails et le résultat souhaité est incomplet. De plus, la réponse acceptée ne donne pas le résultat souhaité.