【问题标题】:Subtracting strings in R在R中减去字符串
【发布时间】:2018-07-05 03:16:06
【问题描述】:

是否有一种简单的方法可以在 tibble 或 data.frame 中的列中减去字符串?

例如在下面的小标题中,有没有一种方法可以轻松地从 a 列和 c 列创建 b 列?类似于我如何从 a 和 b 创建 c? (即 c = a + b,所以 b = c - a)。

ex1 <- tibble(a = rep(c("orange", "green", "grey"), 2),
   b = rep(c("ball", "hockey puck"), each = 3),
   c = str_c(a, " ", b))

我希望该解决方案适用于 a 列和 b 列中每个字符串中任意数量的单词。

例如,我正在按照以下代码的方式思考一些事情(分解单词并进行成对比较),但它并不完全奏效。

ex1 %>% 
  separate_rows(c) %>% 
  filter(b != c) %>% 
  group_by(a, b) %>% 
  summarize(a2 = str_c(c, collapse = " "))

有什么想法吗?

【问题讨论】:

    标签: r string tidyverse stringr


    【解决方案1】:

    这些都应该工作:

    ex1 %>% 
      rowwise() %>% 
      mutate( b = sub(a, "", c) %>% str_trim() )
    
    # # A tibble: 6 x 3
    #        a            b                  c
    #    <chr>        <chr>              <chr>
    # 1 orange         ball        orange ball
    # 2  green         ball         green ball
    # 3   grey         ball          grey ball
    # 4 orange  hockey puck orange hockey puck
    # 5  green  hockey puck  green hockey puck
    # 6   grey  hockey puck   grey hockey puck
    
    ex1 %>% mutate( b = str_replace(ex1$c, ex1$a, "") %>% str_trim() )
    
    # # A tibble: 6 x 3
    #        a           b                  c
    #    <chr>       <chr>              <chr>
    # 1 orange        ball        orange ball
    # 2  green        ball         green ball
    # 3   grey        ball          grey ball
    # 4 orange hockey puck orange hockey puck
    # 5  green hockey puck  green hockey puck
    # 6   grey hockey puck   grey hockey puck
    

    【讨论】:

    • 这看起来不错,但是如果“a”列中的值不能作为正则表达式工作,会发生什么?例如,想象值是“灰色”而不是“绿色”。我想你可以用 rowwise() 来避免这种情况,但是如果 a 中的值有特殊字符会发生什么?
    • 正如我在回答中所写的那样,substr_replace 都尝试使用来自a 的值来匹配要在c 中替换的确切子字符串。如果要删除非精确匹配中的第一个单词(例如,“橙色|绿色|灰色”集合中的任何颜色),则需要使用正则表达式模式。
    • @ 如果你有特殊字符,你应该在模式周围使用fixed()
    【解决方案2】:

    你可以写一个函数来做这个

    `%-%`=function(x,y)sub(paste0("\\s*",y,"\\s*",collapse="|"),"",x)
    ex1$c%-%ex1$a # To obtain b ie c-a
    [1] "ball"        "ball"        "ball"        "hockey puck" "hockey puck" "hockey puck"
    ex1$c%-%ex1$b # To obtain a ie c-b
    [1] "orange" "green"  "grey"   "orange" "green"  "grey"  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多