替换列名 gsub 中的字符

Posted

技术标签:

【中文标题】替换列名 gsub 中的字符【英文标题】:Replace characters in column names gsub 【发布时间】:2017-02-01 21:54:50 【问题描述】:

我正在阅读一堆标题中包含“销售额 - 数千”之类的 CSV,并在 R 中以“销售额...数千”的形式出现。我想使用正则表达式(或其他简单方法)来清理这些。

我不明白为什么这不起作用:

#mock data
  a <- data.frame(this.is.fine = letters[1:5],
                  this...one...isnt = LETTERS[1:5])

#column names
  colnames(a)
  # [1] "this.is.fine"  "this...one...isnt"

#function to remove multiple spaces
  colClean <- function(x)
    colnames(x) <- gsub("\\.\\.+", ".", colnames(x))
  

#run function
  colClean(a)

#names go unaffected
  colnames(a)
  # [1] "this.is.fine"  "this...one...isnt"

但是这段代码可以:

#direct change to names
  colnames(a) <- gsub("\\.\\.+", ".", colnames(a))

#new names
  colnames(a)
  # [1] "this.is.fine"  "this.one.isnt"

请注意,如果发生这种情况,我可以在单词之间留一个句点。

谢谢。

【问题讨论】:

替换发生在本地,函数内部,而不是全局。如果你在函数的最后一行return(x),你会得到更新的数据框。 感谢您的快速回复!您可以键入需要编写的函数吗?我尝试将return(x) 放入代码中,但没有得到我期望的结果。我可以让它打印出列名或打印出带有新列名的数据框,但是这两种尝试都没有真正改变全局环境中的数据框。 您还需要使用更新的数据框来覆盖现有的数据框,或者分配给新的变量。即使你做了return(x),原始数据框也不会被函数本身改变。 定义colClean &lt;- function(x) colnames(x) &lt;- gsub("\\.\\.+", ".", colnames(x)); x 然后执行a &lt;- colClean(a)更新a d'oh,作业的最后一步!显然是漫长一周的结果。感谢您的帮助。 【参考方案1】:

Rich Scriven 得到了答案:

定义

colClean <- function(x) colnames(x) <- gsub("\\.\\.+", ".", colnames(x)); x  

然后做

a <- colClean(a) 

更新一个

【讨论】:

【参考方案2】:
names(a) <- gsub(x = names(a), pattern = "\\.", replacement = "#")  

您可以使用gsub 函数将. 替换为另一个特殊字符,例如#

【讨论】:

我不得不用 'colnames' 替换 'names' 或使用 'fixed=T' 来不替换整个列名。

以上是关于替换列名 gsub 中的字符的主要内容,如果未能解决你的问题,请参考以下文章

使用gsub(),如何在替换字符串中引用被替换字符串?

替换 R 中的单个反斜杠

替换/翻译字符串中的字符

lua中怎么替换掉字符串中的$^特殊字符?

R 中的 gsub() 没有替换 '.' (点)

用数字R替换列中的字符