Cambiar nombres de columna en una lista de marcos de datos en R
dataframe (3)
Objetivo: cambiar los nombres de columna de todos los marcos de datos en el entorno global de la siguiente lista
colnames de los del entorno global
Entonces.
0) Los nombres de columna son:
colnames = c("USAF","WBAN","YR--MODAHRMN")
1) Tengo los siguientes data.frames: df1, df2.
2) Los puse en una lista:
dfList <- list(df1,df2)
3) Recorrer la lista:
for (df in dfList){
colnames(df)=colnames
}
Pero esto crea un nuevo df con los nombres de columna que necesito, no cambia los nombres de columna originales en df1, df2. ¿Por qué? ¿Podría ser una solución? Gracias
Puede algo como:
lapply(dfList, function(x) {colnames(dfList)=colnames})
¿trabajo?
Con lapply puedes hacerlo de la siguiente manera.
Crear datos de muestra:
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")
Luego, pase la lista usando
setNames
y proporcione el vector de nuevos nombres de columna como segundo argumento para
setNames
:
lapply(dfList, setNames, colnames)
#[[1]]
# USAF WBAN YR--MODAHRMN
#1 1 2 3
#
#[[2]]
# USAF WBAN YR--MODAHRMN
#1 1 2 3
Editar
Si desea asignar los data.frames al entorno global, puede modificar el código de esta manera:
dfList <- list(df1 = df1, df2 = df2)
list2env(lapply(dfList, setNames, colnames), .GlobalEnv)
Si desea que el bucle
for
funcione, no debe pasar todo el data.frame como argumento.
for (df in 1:length(dfList))
colnames(dfList[[df]]) <- colnames
Simplemente cambie su ciclo for en un índice for-loop como este:
Datos
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")
Solución
for (i in seq_along(dflist)){
colnames(dflist[[i]]) <- colnames
}
Salida
> 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
Al usar
for (df in dfList)
esencialmente está creando un nuevo df cada vez y cambia los nombres de columna a los que dejan intacta la lista original (
dfList
).