【问题标题】:grep() and sub() and regular expressiongrep() 和 sub() 以及正则表达式
【发布时间】:2018-06-13 18:51:33
【问题描述】:

我想将我的data.frame 中的变量名称从例如更改为“pmm_StartTimev4_E2_C19_1”到“pmm_StartTimev4_E2_C19”。因此,如果名称以下划线结尾,后跟任意数字,它将被删除。

但我希望只有在变量名称中包含“Start”一词时才会发生这种情况。

我有一段混乱的代码无法运行。任何帮助,将不胜感激!

# Current data frame:    
dfbefore <- data.frame(a=c("pmm_StartTimev4_E2_C19_1","pmm_StartTimev4_E2_E2_C1","delivery_C1_C12"),b=c("pmm_StartTo_v4_E2_C19_2","complete_E1_C12_1","pmm_StartTo_v4_E2_C19"))

# Desired data frame:
dfafter <- data.frame(a=c("pmm_StartTimev4_E2_C19","pmm_StartTimev4_E2_E2_C1","delivery_C1_C12"),b=c("pmm_StartTo_v4_E2_C19","complete_E1_C12_1","pmm_StartTo_v4_E2_C19"))

# Current code:
sub((.*{1,}[0-9]*).*","",grep("Start",names(df),value = TRUE)

【问题讨论】:

  • sub("_\\d$", ""

标签: r regex string-substitution


【解决方案1】:

使用gsub() 来做这样的事情怎么样。

stripcol <- function(x) {
  gsub("(.*Start.*)_\\d+$", "\\1", as.character(x))  
}

dfnew <- dfbefore
dfnew[] <- lapply(dfbefore, stripcol)

我们使用正则表达式查找“​​开始”,然后抓取除下划线数字之外的所有内容。我们使用lapply 将函数应用于所有列。

【讨论】:

  • 每个字符串只有一个替换,所以gsub可以是sub
【解决方案2】:
doit <- function(x){
  x <- as.character(x)
  if(grepl("Start",x)){
    x <- gsub("_([0-9])","",x)
  }
  return(x)
} 


apply(dfbefore,c(1,2),doit)
    a                          b                      
[1,] "pmm_StartTimev4_E2_C19"   "pmm_StartTo_v4_E2_C19"
[2,] "pmm_StartTimev4_E2_E2_C1" "complete_E1_C12_1"    
[3,] "delivery_C1_C12"          "pmm_StartTo_v4_E2_C19"

【讨论】:

    【解决方案3】:

    我们可以使用sub 来捕获还存在“开始”子字符串后跟一个下划线和一个或多个数字的组。在替换中,使用捕获组的反向引用。由于有多个列,使用lapply 循环列,应用sub 并将输出分配回原始数据

    out <- dfbefore
    out[] <- lapply(dfbefore, sub, 
                pattern = "^(.*_Start.*)_\\d+$", replacement ="\\1")
    out
    
    dfafter[] <- lapply(dfafter, as.character)
    all.equal(out, dfafter, check.attributes = FALSE)
    #[1] TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多