web-dev-qa-db-fra.com

Modification des noms de colonne dans une liste de cadres de données en mode R

Objectif: modifier les noms de colonne de tous les cadres de données dans l'environnement global dans la liste suivante

noms de couleurs de ceux dans l'environnement global

Alors. 

0) Les noms de colonne sont:

 colnames = c("USAF","WBAN","YR--MODAHRMN") 

1) J'ai les data.frames suivants: df1, df2. 

2) Je les mets dans une liste: 

  dfList <- list(df1,df2)

3) Parcourez la liste:

 for (df in dfList){
   colnames(df)=colnames
 }

Mais cela crée un nouveau df avec les noms de colonnes dont j'ai besoin, cela ne change pas les noms de colonnes d'origine dans df1, df2. Pourquoi? Lapply pourrait-il être une solution? Merci

Peut quelque chose comme:

 lapply(dfList, function(x) {colnames(dfList)=colnames})

travail?

14
Oniropolo

Avec lapply, vous pouvez le faire comme suit.

Créer des exemples de données:

df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(X = 1, Y = 2, Z = 3)
dfList <- list(df1,df2)
colnames <- c("USAF","WBAN","YR--MODAHRMN") 

Ensuite, appliquez setNames sur la liste et indiquez le vecteur des nouveaux noms de colonne en tant que second argument de setNames:

lapply(dfList, setNames, colnames)
#[[1]]
#  USAF WBAN YR--MODAHRMN
#1    1    2            3
#
#[[2]]
#  USAF WBAN YR--MODAHRMN
#1    1    2            3

Modifier

Si vous souhaitez réattribuer les données.frames à l'environnement global, vous pouvez modifier le code comme suit:

dfList <- list(df1 = df1, df2 = df2)
list2env(lapply(dfList, setNames, colnames), .GlobalEnv)
21
docendo discimus

Il suffit de changer votre boucle for en un index pour boucle comme ceci:

Les données

df1 <- data.frame(a=runif(5), b=runif(5), c=runif(5))
df2 <- data.frame(a=runif(5), b=runif(5), c=runif(5))

dflist <- list(df1,df2)

colnames = c("USAF","WBAN","YR--MODAHRMN") 

Solution

for (i in seq_along(dflist)){
  colnames(dflist[[i]]) <- colnames
}

Sortie

> dflist
[[1]]
       USAF      WBAN YR--MODAHRMN
1 0.8794153 0.7025747    0.2136040
2 0.8805788 0.8253530    0.5467952
3 0.1719539 0.5303908    0.5965716
4 0.9682567 0.5137464    0.4038919
5 0.3172674 0.1403439    0.1539121

[[2]]
        USAF       WBAN YR--MODAHRMN
1 0.20558383 0.62651334    0.4365940
2 0.43330717 0.85807280    0.2509677
3 0.32614750 0.70782919    0.6319263
4 0.02957656 0.46523151    0.2087086
5 0.58757198 0.09633181    0.6941896

En utilisant for (df in dfList), vous créez essentiellement un nouveau fichier df à chaque fois et vous modifiez les noms de colonnes pour qu'ils conservent la liste d'origine (dfList).

5
LyzandeR

Si vous voulez que la boucle for fonctionne, vous ne devez pas passer l'argument data.frame complet.

for (df in 1:length(dfList))
  colnames(dfList[[df]]) <- colnames
0
StrikeR