【问题标题】:Find and replace column name with the match from the find使用查找中的匹配项查找并替换列名
【发布时间】:2015-04-08 19:12:47
【问题描述】:

我正在尝试重命名名为 totsMerge 的数据框中的列

我需要在现有列名中找到任何介于 _TCO 之间的字符串,然后是两个数字,然后是另一个 _ 例如 TC017TC034 然后我想用匹配替换现有的列名(此匹配后的名称中有字符)。 我尝试使用 $1 进行匹配,但它用这个替换了匹配 如何将列名替换为该列名中的匹配项?

  names(totsMerge) <- gsub("(_TC0.+?_)",'$1',names(totsMerge))

例如我想更改列名

 SLX.9397._HGD_TC070III_E_FLD0252.Read1_SND_QHGD_Apos.fq.gz 

 TC070III

【问题讨论】:

  • 我在上面添加了一个例子

标签: r


【解决方案1】:

试试

 sub('.*?_(TC0\\d{2}[^_]*).*', '\\1', str1)
 #[1] "TC070III"

或者

 library(stringr)
 str_extract(str1, 'TC0\\d{2}[^_]*')
 #[1] "TC070III"

数据

 str1 <- 'SLX.9397._HGD_TC070III_E_FLD0252.Read1_SND_QHGD_Apos.fq.gz' 

【讨论】:

  • 完美。非常感谢
  • @user3632206 没问题。很高兴为您提供帮助
  • 我想知道为什么 OPs 代码不起作用。例如,str_extract(str1, '(_TC0.+?_)') 几乎会给出想要的结果,为什么它没有给出与sub("(_TC0.+?_)",'\\1',str1) 相同的输出?
  • @DavidArenburg 我认为一个原因是它可能与字符串的开头不匹配,因为_TCO. 不是起始字符。第二个.+ 还可以包括_,其中有多个_。虽然这适用于sub(".*?(_TC0[^_]*_).*",'\\1',str1),但两端都有_
  • @DavidArenburg 提取匹配正确,但替换失败。使用str_replacestr_replace(str1, '(_TC0.+?_)', '\\1') 另一个不太复杂的例子是v1 &lt;- c('_TC01113D_25', '125_TC0111_25'); sub("(_TC0.+?_)",'\\1',v1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2014-06-18
  • 1970-01-01
  • 2022-12-11
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多