【发布时间】:2019-11-22 13:53:55
【问题描述】:
我有一列数据字符串看起来像1402 2010 10
我想将第一个空格替换为下划线,第二个空格替换为正斜杠,使其看起来像这样1402_2010/10
【问题讨论】:
我有一列数据字符串看起来像1402 2010 10
我想将第一个空格替换为下划线,第二个空格替换为正斜杠,使其看起来像这样1402_2010/10
【问题讨论】:
一个想法来自sub,
sub('(^[0-9]+)\\s([0-9]+)\\s([0-9]+)', '\\1_\\2/\\3', '1402 2010 10')
#[1] "1402_2010/10"
【讨论】:
你可以嵌套sub如下:
x <- c("1402 2010 10")
sub(" ", "/", sub(" ", "_", x))
#"1402_2010/10"
?sub
子(模式,替换,x)。
x 是寻找匹配的字符向量。 这里的技巧是使用sub 代替x(它与_ 匹配它找到的第一个空格)并且外部sub 用/ 替换它找到的第一个空格。成为 x 的第二个空间。
注意:这只会替换第一个和第二个空格,以防您的字符串有更多空格。
【讨论】:
gsub 替换整个字符串,如我的注释中所示。例如x <- c("1402 2010 10 200")。我觉得不然,我可以删除它。
使用gsubfn,您可以编写一个函数来跟踪匹配count 的索引,例如1 表示第一次匹配,2 表示第二次匹配等,并相应地更改替换
gsubfn(' ', proto(fun = function(this, x) c('_', '/')[count]), v)
#[1] "1402_2010/10"
或者,使用 Reduce 与 base R 的想法相同
seq_sub <- function(x, pattern, replacement){
Reduce(function(x, y) sub(pattern, y, x), replacement, init = x)
}
seq_sub('some words here ', ' ', c(9, 5, 2))
# [1] "some9words5here2"
【讨论】:
试试这个,嵌套sub()(第一个空格)和gsub()(其他空格):
v <- "1402 2010 10"
gsub(" ","/",sub(" ","_",v))
[1] "1402_2010/10"
【讨论】: