【问题标题】:Paste strings between patterns in R在R中的模式之间粘贴字符串
【发布时间】:2021-12-19 22:24:42
【问题描述】:

我想根据字符串第一次出现的索引将向量的元素粘贴/折叠在一起,直到它再次出现。例如,

v <- c("foo", "bar1", "bar2", "foo", "bar1", "foo", "bar1", "bar2", "bar3", "foo")
v
[1] "foo"  "bar1" "bar2" "foo"  "bar1" "foo"  "bar1" "bar2" "bar3" "foo" 

我可以这样做

c(paste0(v[1:3], collapse = ""), paste0(v[4:5], collapse = ""), paste0(v[6:9], collapse = ""), paste0(v[10:10], collapse = ""))
[1] "foobar1bar2"     "foobar1"         "foobar1bar2bar3" "foo"  

模式总是“foo”,但是 foo 之后的元素数量总是会改变(就像这个例子一样,它是 2、1、3、0)。有很多行,所以我宁愿避免循环。我想我可以使用

b <- which(v == "foo")
b
[1]  1  4  6 10
sapply(1:(length(b)-1), function(x) paste0(v[b[x]:(b[x+1]-1)], collapse = ""))
[1] "foobar1bar2"     "foobar1"         "foobar1bar2bar3"

我想念最后一个“foo”。任何帮助将不胜感激!

【问题讨论】:

    标签: r string loops


    【解决方案1】:

    这个怎么样

    sapply(split(v, cumsum(v=='foo')), paste0, collapse='')
    

    【讨论】:

    • 这太简单了!很好的答案。
    • 这个很干净,谢谢!
    【解决方案2】:

    我认为你只需要处理最后一个“foo”:

    v <- c("foo", "bar1", "bar2", "foo", "bar1", "foo", "bar1", "bar2", "bar3", "foo")
    
    b <- which(v == "foo")
    
    sapply(seq_along(b), 
           function(i) {
             if (i < length(b)) {
               paste(v[b[i]:(b[i+1] - 1)], collapse = "")
               } else {
                 v[b[i]]
               }
             }
           )
    

    返回

    #> [1] "foobar1bar2"     "foobar1"         "foobar1bar2bar3" "foo"      
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 1970-01-01
      • 2018-08-21
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多