我想用循环更改列名
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]
.
我有一个数据集列名称看起来像那样
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]
.