替换 sqldf 中的字符串模式
Replace String Pattern in sqldf
我有如下数据框:
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
和 -
。破折号的开头和结尾没有空格。
预期输出:
Col1 Col2 Col3
ten - end 5 10
five - nb 7 11
12-4 12 10
13-56 15 16
下面是一个使用 sqldf 的示例语法:
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
1)假设只允许问题中显示的形式用减号替换冒号,然后用space替换减号后跟space , 负号, space.
library(sqldf)
sqldf("select *, replace(replace([Col1], ':', '-'), '- ', ' - ') as New from df")
给予:
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) 如果我们可以假设唯一的形式是 number:number 或 character: character 并且第二种形式不包含数字。
sqldf("select *,
case when strFilter(Col1, '0123456789') = ''
then replace(Col1, ':', ' -')
else replace(Col1, ':', '-')
end as New
from df")
给予:
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) 这首先检查 numbers:numbers 然后检查字符:字符只能是数字或小写字母的字符。
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")
给予:
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 是 space,如果 x 和 z 是数字或小写,则执行适当的替换,否则执行 returns Col1。 dig
和diglet
来自上面。
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")
备注
可重现形式的输入是:
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)
我有如下数据框:
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
和 -
。破折号的开头和结尾没有空格。
预期输出:
Col1 Col2 Col3
ten - end 5 10
five - nb 7 11
12-4 12 10
13-56 15 16
下面是一个使用 sqldf 的示例语法:
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
1)假设只允许问题中显示的形式用减号替换冒号,然后用space替换减号后跟space , 负号, space.
library(sqldf)
sqldf("select *, replace(replace([Col1], ':', '-'), '- ', ' - ') as New from df")
给予:
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) 如果我们可以假设唯一的形式是 number:number 或 character: character 并且第二种形式不包含数字。
sqldf("select *,
case when strFilter(Col1, '0123456789') = ''
then replace(Col1, ':', ' -')
else replace(Col1, ':', '-')
end as New
from df")
给予:
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) 这首先检查 numbers:numbers 然后检查字符:字符只能是数字或小写字母的字符。
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")
给予:
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 是 space,如果 x 和 z 是数字或小写,则执行适当的替换,否则执行 returns Col1。 dig
和diglet
来自上面。
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")
备注
可重现形式的输入是:
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)