r substring通配符搜索查找文本

use*_*622 3 substring r wildcard

我有一个data.frame列,其值如下所示.我想使用每个单元格并创建两个列 - num1和num2,使得num1 =" - "之前的所有内容,num2 =" - "和"."之间的所有内容.

我想用gregexpr功能,如图所示这里,写一个for循环,以每行迭代.有更快的方法吗?

60-150.PNG
300-12.PNG

employee <- c('60-150.PNG','300-12.PNG')
employ.data <- data.frame(employee)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

尝试

library(tidyr)
extract(employ.data, employee, into=c('num1', 'num2'),
                    '([^-]*)-([^.]*)\\..*', convert=TRUE)
#   num1 num2
#1   60  150
#2  300   12
Run Code Online (Sandbox Code Playgroud)

要么

library(data.table)#v1.9.5+
setDT(employ.data)[, tstrsplit(employee, '[-.]', type.convert=TRUE)[-3]]
#    V1  V2
#1:  60 150
#2: 300  12
Run Code Online (Sandbox Code Playgroud)

或者基于@ rawr的评论

 read.table(text=gsub('-|.PNG', ' ', employ.data$employee),
           col.names=c('num1', 'num2'))
 #   num1 num2
 #1   60  150
 #2  300   12
Run Code Online (Sandbox Code Playgroud)

更新

保留原始列

extract(employ.data, employee, into=c('num1', 'num2'), remove=FALSE,
        '([^-]*)-([^.]*)\\..*', convert=TRUE)
#    employee num1 num2
#1 60-150.PNG   60  150
#2 300-12.PNG  300   12
Run Code Online (Sandbox Code Playgroud)

要么

 setDT(employ.data)[, paste0('num', 1:2) := tstrsplit(employee, 
             '[-.]', type.convert=TRUE)[-3]]
 #     employee num1 num2
 #1: 60-150.PNG   60  150
 #2: 300-12.PNG  300   12
Run Code Online (Sandbox Code Playgroud)

要么

 cbind(employ.data, read.table(text=gsub('-|.PNG', ' ', 
     employ.data$employee),col.names=c('num1', 'num2')))
 #    employee num1 num2
 #1 60-150.PNG   60  150
 #2 300-12.PNG  300   12
Run Code Online (Sandbox Code Playgroud)

  • akrun教我这个`read.table(text = gsub(' - | .PNG','',dat $ employee)) (2认同)