【问题标题】:How to identify the Nth repetition of an element in a string?如何识别字符串中元素的第 N 次重复?
【发布时间】:2018-03-02 16:16:41
【问题描述】:

library(tidyverse)

我的数据

str <- tibble(value = c("var_imp_01_prevalence",
                        "var_imp_MeanDecreaseGini_variance_pairwise_distance",
                        "var_imp_06_extinction_rate"))
str
  value                  
  <chr>                  
1 var_imp_01_prevalence  
2 var_imp_MeanDecreaseGini_variance_pairwise_distance
3 var_imp_06_extinction_rate 

我想要的输出

  a        b            
  <chr>    <chr>        
1 var_imp_01 prevalence
2 var_imp_MeanDecreaseGini variance_pairwise_distance
3 var_imp_06 extinction_rate

详情

所以,基本上我想使用 tidyr::separate 函数来查找第三个 '_' 并分隔我的列。

【问题讨论】:

  • 会找到最后的下划线吗?这可能更容易。
  • 不是真的,真实数据后面有更多的下划线
  • str %&gt;% extract(value, into = c("a", "b"), regex = "(.*_.*_.*)_(.*)")?
  • A5C1D2H2I1M1N2O1R2T1:这不起作用,它正在根据真实数据中的最后一个_分离数据。

标签: r regex tidyr stringr


【解决方案1】:

使用extract,可以做到,例如这边走。 ^ 对于不匹配基于最后一个_ 很重要

str %>% extract(value, into = c("a", "b"), regex = "^([^_]*_[^_]*_[^_*]*)_(.*)")

# A tibble: 3 x 2
  a                        b                         
* <chr>                    <chr>                     
1 var_imp_01               prevalence                
2 var_imp_MeanDecreaseGini variance_pairwise_distance
3 var_imp_06               extinction_rate  

【讨论】:

  • 成功了,谢谢!另一个问题是是否可以简化正则表达式以仅说明重复次数,以防有人必须匹配第 50 次而不是第 3 次。
  • 很高兴它有帮助!您可以通过将主要模式 ([^_]*_) 放入自己的组中,根据需要多次重复该模式。既然你有太多的一组,你只需用?: 使内部组不被捕获。例如,您可以使用此正则表达式代替^((?:[^_]*_){3})(.*).. 可能也更直观,因为它包含3。唯一的缺点是您将在与a 的匹配结束时使用_,但可以再添加一行。
【解决方案2】:
str%>%mutate(value=sub("((_.*?){3})","\\1SPLIT",value))%>%separate(value,c("a","b"),"_SPLIT")
# A tibble: 3 x 2
                         a                          b
*                    <chr>                      <chr>
1               var_imp_01                 prevalence
2 var_imp_MeanDecreaseGini variance_pairwise_distance
3               var_imp_06            extinction_rate

【讨论】:

  • 这是一个很好的解决方案,想知道正则表达式是否可以直接放在单独的函数中,以避免变异代码。
  • 会调查的。它只是
【解决方案3】:

这是regex的工作,请尝试使用以下代码:

# For 'a' 
a <- sub("(^.*)_...", "\\1", str[1]) # [1] "var_imp_01valence"

# For 'b'
b <- sub("^.*_(...)", "\\1", str[1]) # [1] "prevalence"

我不是 regex 方面的专家,但至少可以为您的示例做这项工作。

希望这能有所帮助。

【讨论】:

  • 谢谢,但我想使用 tidyr 包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2013-02-20
  • 1970-01-01
  • 2013-07-27
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多