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
3 Réponses :
Vous pouvez le faire dans un Ou en utilisant Rendements 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
Map code> comme @Sotos suggéré
LIST <- Map(function(x, y) {names(x) <- paste0(y, '.', names(x)); x}, LIST, names(LIST))
lapply(seq_along(LIST), function(x)
names(LIST[[x]]) <<- paste0(names(LIST)[x], ".", names(LIST[[x]])))
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.
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 = ".")))
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
Parfait! Je n'étais pas au courant du comportement de as.data.frame
. Beaucoup plus simple que les choses que j'essayais!