在R中更改数据帧列表中的列名

时间:2022-03-18 18:36:27

Objective: Change the Column Names of all the Data Frames in the Global Environment from the following list

目的:从以下列表中更改全局环境中所有数据帧的列名。

colnames of the ones in global environment

全局环境下的名称

So.

所以。

0) The Column names are:

0)列名为:

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

1) I have the following data.frames: df1, df2.

1)我有以下数据。帧:df1, df2。

2) I put them in a list:

我把它们列在一张清单上:

  dfList <- list(df1,df2)

3) Loop through the list:

3)循环浏览列表:

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

But this creates a new df with the column names that I need, it doesn't change the original column names in df1, df2. Why? Could lapply be a solution? Thanks

但这会创建一个新的df,包含我需要的列名,它不会改变df1, df2中的原始列名。为什么?lapply是一个解决方案吗?谢谢

Can something like:

可以这样:

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

work?

工作吗?

3 个解决方案

#1


16  

With lapply you can do it as follows.

用lapply,你可以这样做。

Create sample data:

创建示例数据:

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

Then, lapply over the list using setNames and supply the vector of new column names as second argument to setNames:

然后,使用setNames在列表上进行lapply,并将新列名的vector作为第二个参数用于setNames:

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

Edit

编辑

If you want to assign the data.frames back to the global environment, you can modify the code like this:

如果您想将data.frame分配回全局环境,可以这样修改代码:

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

#2


4  

Just change your for-loop into an index for-loop like this:

只需将for-loop改为index for-loop,如下所示:

Data

数据

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
}

Output

输出

> 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

By using for (df in dfList) you are essentially creating a new df each time and change the column names to that leaving the original list (dfList) untouched.

通过使用for (dfList中的df),您实际上每次都创建一个新的df,并将列名更改为保持原始列表(dfList)不变。

#3


0  

If you want the for loop to work, you should not pass the whole data.frame as the argument.

如果希望for循环工作,则不应该将整个data.frame作为参数传递。

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

#1


16  

With lapply you can do it as follows.

用lapply,你可以这样做。

Create sample data:

创建示例数据:

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

Then, lapply over the list using setNames and supply the vector of new column names as second argument to setNames:

然后,使用setNames在列表上进行lapply,并将新列名的vector作为第二个参数用于setNames:

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

Edit

编辑

If you want to assign the data.frames back to the global environment, you can modify the code like this:

如果您想将data.frame分配回全局环境,可以这样修改代码:

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

#2


4  

Just change your for-loop into an index for-loop like this:

只需将for-loop改为index for-loop,如下所示:

Data

数据

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
}

Output

输出

> 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

By using for (df in dfList) you are essentially creating a new df each time and change the column names to that leaving the original list (dfList) untouched.

通过使用for (dfList中的df),您实际上每次都创建一个新的df,并将列名更改为保持原始列表(dfList)不变。

#3


0  

If you want the for loop to work, you should not pass the whole data.frame as the argument.

如果希望for循环工作,则不应该将整个data.frame作为参数传递。

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