更改R中数据框列表中的列名

Oni*_*olo 16 r dataframe

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

全球环境中的人名

所以.

0)列名是:

 colnames = c("USAF","WBAN","YR--MODAHRMN") 
Run Code Online (Sandbox Code Playgroud)

1)我有以下data.frames:df1,df2.

2)我把它们放在一个清单中:

  dfList <- list(df1,df2)
Run Code Online (Sandbox Code Playgroud)

3)循环列表:

 for (df in dfList){
   colnames(df)=colnames
 }
Run Code Online (Sandbox Code Playgroud)

但是这会创建一个带有我需要的列名的新df,它不会更改df1,df2中的原始列名.为什么?可以提供解决方案吗?谢谢

可以像:

 lapply(dfList, function(x) {colnames(dfList)=colnames})
Run Code Online (Sandbox Code Playgroud)

工作?

tal*_*lat 26

有了lapply,你可以这样做.

创建样本数据:

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") 
Run Code Online (Sandbox Code Playgroud)

然后,在列表上使用setNames并提供新列名称的向量作为第二个参数setNames:

lapply(dfList, setNames, colnames)
#[[1]]
#  USAF WBAN YR--MODAHRMN
#1    1    2            3
#
#[[2]]
#  USAF WBAN YR--MODAHRMN
#1    1    2            3
Run Code Online (Sandbox Code Playgroud)

编辑

如果要将data.frames分配回全局环境,可以像这样修改代码:

dfList <- list(df1 = df1, df2 = df2)
list2env(lapply(dfList, setNames, colnames), .GlobalEnv)
Run Code Online (Sandbox Code Playgroud)


Lyz*_*deR 7

只需将for循环更改为-循环索引,如下所示:

数据

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") 
Run Code Online (Sandbox Code Playgroud)

for (i in seq_along(dflist)){
  colnames(dflist[[i]]) <- colnames
}
Run Code Online (Sandbox Code Playgroud)

产量

> 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
Run Code Online (Sandbox Code Playgroud)

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