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

wko9yo5t  于 2023-01-10  发布在  其他
关注(0)|答案(6)|浏览(272)

目标:更改以下列表中全局环境中所有数据框的列名
全局环境中的列名
所以。
0)列名为:

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

1)我有以下 Dataframe :DF1,DF2。
2)我把它们列成一个清单:

dfList <- list(df1,df2)

3)循环遍历列表:

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

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

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

工作?

stszievb

stszievb1#

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

然后,使用setNames对列表应用lapply,并将新列名的向量作为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)
9rnv2umw

9rnv2umw2#

只需将你的for循环转换成如下的index 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")

解决方案

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)不变的列名。

q5iwbnjs

q5iwbnjs3#

如果你想让for循环工作,你不应该把整个data.frame作为参数传递。

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

kqhtkvqz4#

创建示例数据:

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

然后创建一个函数来设置列名:

res=lapply(dfList, function(x){colnames(x)=c(name);x})

[[1]]
USAF WBAN YR--MODAHRMN
1    1    2            3

[[2]]
USAF WBAN YR--MODAHRMN
1    1    2            3
apeeds0o

apeeds0o5#

tidyverse解决方案与rename_with

library(dplyr)
library(purrr)

map(dflist, ~ rename_with(., ~ colnames))

或者,如果仅针对一列:

map(dflist, ~ rename(., new_col = old_col))

这也适用于lapply

lapply(dflist, rename_with, ~ colnames)
lapply(dflist, rename, new_col = old_col)
nnt7mjpx

nnt7mjpx6#

dfList <- lapply(dfList, `names<-`, colnames)

相关问题