1
votes

Rassembler les mêmes années dans un dataframe en r?

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

r

1 commentaires

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é.


3 Réponses :


1
votes

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


0 commentaires

1
votes
   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()


1 commentaires

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.



0
votes

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


1 commentaires

J'ai voté pour l'interrogateur.