【问题标题】:I want to change the columns names with a loop我想用循环更改列名
【发布时间】:2020-05-02 20:31:15
【问题描述】:

我有一个看起来像这样的数据集列名

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

我想更改列的名称并删除“状态”。部分只留下“abb”、“area”、“division”和“region”。 我使用 substr func 在 df 列上循环编写了这段代码,但它不起作用也不会出错。请问有什么问题吗?


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

【问题讨论】:

  • 我认为@akrun 的答案应该是公认的——他们提供了更全面的解决方案,首先,我只添加了一个答案来提供这样的解释和替代方案(给猫剥皮的方法不止一种)
  • 嘿,我试图接受两者,但似乎它不起作用。我重新接受了你的,因为它让我开始探索 colnames(df[1]) 和 colnames(df)[1] 之间的区别。你有我所有的感谢谢谢!

标签: r loops rstudio columnname


【解决方案1】:

这里,我们可以把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

【讨论】:

  • 谢谢老兄。我以为我可以接受尽可能多的解决方案,但似乎没有。非常感谢
  • @HoussamBaiz 没关系。只是我认为我的解决方案有问题,我找不到
【解决方案2】:

作为替代解决方案,您可以使用gsub() 替换所有“状态”。什么都没有(“”),这里只显示一个向量:

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]) 您返回的是与主数据框隔离的单列数据框的列名,而不是处理主数据框本身。例如,iris[1] 返回一个包含一列的数据框 - 请参阅 str(iris[1]) - 所以 colnames(iris[1]) 返回该隔离的列名。稍作更改,您就可以返回(然后更改)iris 列名向量的第一个元素:colnames(iris)[1]

【讨论】:

  • 我快要疯了才能找到 colnames(df[1]) 和 colnames(df)[1] 之间的区别。你有我所有的感激之情男人(或女人,无论你是谁)!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2015-10-01
相关资源
最近更新 更多