2
votes

Collez le nom de l'élément dans les colonnes de chaque élément de la liste

J'ai une liste de dataframes. Chaque élément de liste a un nom unique mais les noms de colonne sont identiques dans tous les blocs de données.

Je voudrais coller le nom de chaque cadre de données dans les colonnes, de sorte que lorsque je cbind les ensemble dans une seule grande trame de données que je peux distinguer entre eux.

Exemple de données;

List of 2
     $ df1:'data.frame':    5 obs. of  2 variables:
      ..$ df1.ColA: int [1:5] 1 2 3 4 5
      ..$ df1.ColB: int [1:5] 10 11 12 13 14
     $ df2:'data.frame':    5 obs. of  2 variables:
      ..$ df2.ColA: int [1:5] 21 22 23 24 25
      ..$ df2.ColB: int [1:5] 30 31 32 33 34

Sortie souhaitée;

XXX


0 commentaires

3 Réponses :


2
votes

Vous pouvez le faire dans un lapply avec une affectation globale .

str(LIST)
# List of 2
# $ df1:'data.frame':   5 obs. of  2 variables:
#   ..$ df1.ColA: int [1:5] 1 2 3 4 5
# ..$ df1.ColB: int [1:5] 10 11 12 13 14
# $ df2:'data.frame':   5 obs. of  2 variables:
#   ..$ df2.ColA: int [1:5] 21 22 23 24 25
# ..$ df2.ColB: int [1:5] 30 31 32 33 34

Ou en utilisant Map code> comme @Sotos suggéré

LIST <- Map(function(x, y) {names(x) <- paste0(y, '.', names(x)); x}, LIST, names(LIST))

Rendements

lapply(seq_along(LIST), function(x) 
  names(LIST[[x]]) <<- paste0(names(LIST)[x], ".", names(LIST[[x]])))


2 commentaires

Une autre variante (plus lisible de l'OMI) de cela est Map (function (x, y) {names (x) <- paste0 (y, '.', Names (x)); x}, LIST, names (LIST ))


@Sotos Nice, donc nous pouvons le faire sans << - , inclus dans la réponse.



1
votes

Bonjour, vous pouvez utiliser map2 pour faire ceci:

imap(mylist, ~rename_all(.x, function(z) paste(.y, z, sep = ".")))

EDIT: ou comme suggéré dans le commentaire, utilisez imap

library(tidyverse)
map2(mylist, names(mylist), ~rename_all(.x, function(z) paste(.y, z, sep = ".")))


0 commentaires

4
votes

Puisque vous indiquez que vous souhaitez utiliser cbind plus tard, vous pouvez utiliser as.data.frame tout de suite

df1 <- as.data.frame(LIST)
split.default(df1, sub("\\..*", "", names(df1)))

Grâce à @RonakShah vous pouvez utiliser les lignes suivantes pour récupérer une liste au cas où vous en auriez besoin

as.data.frame(LIST)
#  df1.ColA df1.ColB df2.ColA df2.ColB
#1        1       10       21       30
#2        2       11       22       31
#3        3       12       23       32
#4        4       13       24       33
#5        5       14       25       34


1 commentaires

Parfait! Je n'étais pas au courant du comportement de as.data.frame . Beaucoup plus simple que les choses que j'essayais!