目标:从以下列表中更改全局环境中所有数据框的列名
全球环境中的名称
因此。
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})
工作?
答案 0 :(得分:21)
有了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
对列表进行提交,并将新列名称的向量作为第二个参数提供给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)
答案 1 :(得分:5)
只需将你的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
)保持不变。
答案 2 :(得分:0)
如果希望for
循环起作用,则不应将整个data.frame作为参数传递。
for (df in 1:length(dfList))
colnames(dfList[[df]]) <- colnames
答案 3 :(得分:0)
dfList <- lapply(dfList, `names<-`, colnames)