【问题标题】:R rstats How to replace a single character in one place in a stringR rstats 如何替换字符串中某个位置的单个字符
【发布时间】:2014-12-26 18:05:17
【问题描述】:

我正在尝试编写一个函数,该函数将接受一个字符串并将一个字符替换为另一个字符,但我希望它返回替换该字符的每个排列。我想用 l 替换每个 i,但我不想像在 gsub 中那样在全局范围内这样做,我也不想像在 sub 中那样只做第一个。我认为一个例子最能说明这一点。如果我传入名称 keviin(带有两个 i):

thisFunction("keviin")
[1] kevlin keviln kevlln

所以我回来替换第一个 i,第二个 i,然后两个 i。这听起来像是递归的工作,但首先我需要弄清楚如何只替换第一个 i。然后我可以将结果字符串传递给函数以获得下一个排列。

有人想推我一下吗?我试过这样做,但对我不起作用:

> substr("keviin",4,4) <- "l"
Error in substr("keviin", 4, 4) <- "l" : 
  target of assignment expands to non-language object

【问题讨论】:

    标签: r string substring


    【解决方案1】:

    来自@CarlWitthoft 的想法,这个怎么样:

    thisFunction<-function(x) {
      xsplit<-strsplit(x,"")[[1]]
      ipos<-as.vector(gregexpr("i",x)[[1]])
      if (length(ipos)==1) {
        if (ipos<0) return(x) else {
          substring(x,ipos,ipos)<-"l"
          return(x)
        }
      }
      combos<-unlist(lapply(seq_along(ipos),combn,x=ipos,simplify=FALSE),recursive=FALSE)
      ret<-t(vapply(combos,function(x) {xsplit[x]<-"l";xsplit},character(length(xsplit))))
      do.call(function(...) paste(...,sep=""),as.data.frame(ret))
    }
    
        thisFunction("keviin")
        #[1] "kevlin" "keviln" "kevlln"
    

    【讨论】:

    • 这似乎适用于我的酷刑测试 "keviinandinandfoiiiiquerbar" 。根据我在回答中的注释,我期望得到 2^7 - 1 结果,实际上得到了 127 。
    【解决方案2】:

    正则表达式和向量采样的组合怎么样?

    kevsplit<-unlist(strsplit('keviin',''))
    the_eyes <-which( grepl('i',kevsplit))
    kevsplit[sample(the_eyes,1)] <-"L"
    newkev<-paste(kevsplit,collapse='')
    

    这将随机换出一个“i”。要交换所有可能的排列, 做类似的事情

    for(j in 1:length(the_eyes) ) {
           calculate all permutations of the_eyes taken j at a time
           swap those selected values to kevsplit and save in some list
           }
    

    我懒得写最后一点:-)

    编辑:澄清一下,除了将东西重新粘贴在一起之外,您的问题基本上是:

    对于 c(0,0,0,0,0,....) 类型的向量(将“i”替换为 0 或逻辑 FALSE),您可以通过多少种方式将 1 个或多个值替换为“真”(或 1)?这是介绍性组合学中的一个标准问题——对于我们这些计算机小白来说,很高兴,结果是用二进制计数!

    【讨论】:

      【解决方案3】:

      由于某种原因,这适用于对象,但不适用于引号中的纯字符串

      thisFunction <- function(x){
      +     
      +     substr(x,4,4) <- 'l'
      +     return(x)
      +     
      + }
      > thisFunction('keviin')
      [1] "kevlin"
      

      有效。

      【讨论】:

      • 他希望函数为一个输入“keviin”返回 3 个字符串
      • 不,他想要替换一个字符的函数......他字面意思是“但首先我需要弄清楚如何只替换第一个 i”。他并没有要求整个解决方案,他只是希望能够先替换一个字符,然后自己完成其余的工作。
      • 如果他想要整个函数,他会说我如何编写一个函数来返回替换一个字符的每个排列,而不是“如何替换字符串中一个位置的单个字符”
      • 他说 thisFunction("keviin") 应该返回 [1] kevlin keviln kevlln。你说得对,他没有明确表达。
      猜你喜欢
      • 2016-08-04
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2012-02-18
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多