我想用循环更改列名

I want to change the columns names with a loop

我有一个数据集列名称看起来像那样

state.abb、state.area、state.division、state.region

我想更改列的名称并删除 "state." 部分以仅保留 "abb"、"area"、"division" 和 "region" . 我使用 substr func 在 df 列上循环编写了这段代码,但它不起作用,也没有给出错误。请问有什么问题吗?


    for(e in 1:ncol(df)){
      colnames(df[e])<-substring(colnames(df[e]),7)
    }

这里,我们可以把colnames(df[e])改成colnames(df)[e]

for(e in seq_along(df)){
     colnames(df)[e] <- substring(colnames(df)[e],7)
}

substring 是矢量化的,因此我们可以直接执行此操作而无需任何 for 循环

colnames(df) <- substring(colnames(df), 7)

此外,如果我们要删除包括 . 的前缀,假设前缀可以是任意长度的通用选项是 sub

colnames(df) <- sub(".*\.", "", colnames(df))

举个例子,

data(mtcars)
colnames(mtcars[1]) <- "hello"
colnames(mtcars[1])
#[1] "mpg" # no change
colnames(mtcars)[1] <- "hello"
colnames(mtcars[1])
#[1] "hello" # changed

作为替代解决方案,您可以使用 gsub() 将所有 "state." 替换为空(“”),此处仅显示一个向量:

gsub("state.", "", c("state.abb", "state.area", "state.division", "state.region"))

要替换 colnames 名称:

colnames(df) <- gsub("state.", "", colnames(df))

作为奖励,假设您想要替换出现在某些但不是所有列中的单词或字符串。以内置的 iris 数据集为例,对于列名称中 "Petal" 的列,您可以使用完全相同的方法将 "Petal" 替换为 "P":

colnames(iris) <- gsub("Petal", "P", colnames(iris))

我不会为这项工作使用 for 循环,使用矢量化方法要容易得多。但是为了解释您的错误,当您执行 colnames(df[1]) 时,您是 return 从主数据框 中分离出的单个列数据框的列名,而不是而不是处理主数据框本身。例如,iris[1] returns 是一个包含一列的数据框 - 请参阅 str(iris[1]) - 所以 colnames(iris[1]) returns 是该隔离的列名称。相反,稍作更改即可 return(然后更改)iris 的列名称向量的第一个元素:colnames(iris)[1].