首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换sqldf中的字符串模式

替换sqldf中的字符串模式
EN

Stack Overflow用户
提问于 2019-04-02 17:45:57
回答 1查看 1.1K关注 0票数 2

我有如下所示的数据:

代码语言:javascript
复制
    Col1    Col2   Col3
ten: end       5     10
five: nb       7     11
    12:4      12     10
   13:56      15     16

使用R中的sqldf包,我想做以下工作:

Col1中的值替换为:character: space-。破折号在开头和结尾都有空格。

Col1中的值替换为:number:number-。破折号在开头和结尾都没有空格。

预期产出:

代码语言:javascript
复制
     Col1    Col2   Col3
ten - end       5     10
five - nb       7     11
     12-4      12     10
    13-56      15     16

下面是一个使用sqldf的示例语法:

代码语言:javascript
复制
df <- sqldf("SELECT *, replace([Col1], [character: space], ' - ') [New Col generated] from df")

df <- sqldf("SELECT *, replace([Col1], [number:number], '-') [New Col generated_num] from df")

我试着引用这个文档,但仍然没有结果:https://www.rexegg.com/regex-quickstart.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-02 20:48:52

1)假设只有问题中所示的形式才允许用减号替换冒号,然后用空格替换负号,然后用空格替换负号。

代码语言:javascript
复制
library(sqldf)
sqldf("select *, replace(replace([Col1], ':', '-'), '- ', ' - ') as New from df")

给予:

代码语言:javascript
复制
      Col1 Col2 Col3       New
1 ten: end    5   10 ten - end
2 five: nb    7   11 five - nb
3     12:4   12   10      12-4
4    13:56   15   16     13-56

2)如果我们可以假设唯一的表单是数字:数字或字符:字符,而第二个表单不包含数字。

代码语言:javascript
复制
sqldf("select *, 
  case when strFilter(Col1, '0123456789') = '' 
         then replace(Col1, ':', ' -')
       else replace(Col1, ':', '-')
       end as New
  from df")

给予:

代码语言:javascript
复制
      Col1 Col2 Col3       New
1 ten: end    5   10 ten - end
2 five: nb    7   11 five - nb
3     12:4   12   10      12-4
4    13:56   15   16     13-56

3)首先检查数字:数字,然后检查字符:字符只能是数字或小写字母。

代码语言:javascript
复制
dig <- "0123456789"
diglet <- "0123456789abcdefghijklmnopqrstuvwxyz"

fn$sqldf("select *,
  case when trim(Col1, '$dig') = ':'
         then replace(Col1, ':', '-')
  when trim(Col1, '$diglet') = ': '
          then replace(Col1, ': ', ' - ')
  else Col1 end as New
  from df")

给予:

代码语言:javascript
复制
      Col1 Col2 Col3       New
1 ten: end    5   10 ten - end
2 five: nb    7   11 five - nb
3     12:4   12   10      12-4
4    13:56   15   16     13-56

4)这个函数提取x:y并检查x和y是否为数字,如果是,则进行适当的替换,如果不匹配,则提取x:yz,其中y是空格,如果x和z是数字或小写,则执行适当的替换,否则返回Col1。digdiglet是从上面来的。

代码语言:javascript
复制
fn$sqldf("select *, 
  case when trim(substr(Col1, instr(Col1, ':')-1, 3), '$dig') = ':'
         then replace(Col1, ':', '-')
       when trim(substr(Col1, instr(Col1, ':') -1, 4), '$diglet') = ': '
         then replace(Col1, ': ', ' - ')
       else Col1 end as New
  from df")

备注

可复制形式的输入如下:

代码语言:javascript
复制
Lines <- "Col1,Col2,Col3
ten: end,5,10
five: nb,7,11
12:4,12,10
13:56,15,16"
df <- read.csv(text = Lines, as.is = TRUE, strip.white = TRUE)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55480734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档