Изменение имен столбцов в списке фреймов данных в R

Цель: изменить имена столбцов всех фреймов данных в глобальной среде из следующего списка

имена кодов в глобальной среде

Итак.

0) Имена столбцов:

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

1) У меня есть следующие data.frames: df1, df2.

2) Я помещаю их в список:

  dfList <- list(df1,df2)

3) Прокрутите список:

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

Но это создает новый df с именами столбцов, которые мне нужны, это не изменяет исходные имена столбцов в df1, df2. Зачем? Может ли это быть решением? Благодаря

Может что-то вроде:

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

работа?

Ответ 1

Вкратце вы можете сделать это следующим образом.

Создайте образцы данных:

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") 

Затем перейдем к списку с помощью setNames и поставьте вектор новых имен столбцов в качестве второго аргумента в setNames:

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

Изменить

Если вы хотите назначить data.frames обратно в глобальную среду, вы можете изменить код следующим образом:

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

Ответ 2

Просто измените for-loop на индекс for-loop следующим образом:

Данные

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") 

Решение

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

Выход

> 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

Используя for (df in dfList), вы по существу создаете новый df каждый раз и изменяете имена столбцов, оставляя исходный список (dfList) нетронутым.

Ответ 3

Если вы хотите, чтобы цикл for работал, вы не должны передавать весь файл data.frame в качестве аргумента.

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