【问题标题】:Put all the numbers in a string to the end in R将字符串中的所有数字放在R中的末尾
【发布时间】:2023-01-27 00:29:18
【问题描述】:

我工作的数据集包含一些数字(通常最多 12 个),我需要在最后包含所有这些数字:

# A tibble: 2 x 1
  a                   
  <chr>               
1 THIS IS 1 AN EXAMPLE
2 THIS 2 IS AN EXAMPLE

我尝试用 gsub 做这样的事情,但它没有像我想要的那样工作:

df <- df %>%
  dplyr::mutate_at(.vars=vars(a), list(~ gsub(" (\\d) ", "\\2 \\1", .)))

给我这个:

    A tibble: 2 x 1
  a                  
  <chr>              
1 THIS IS 1AN EXAMPLE
2 THIS 2IS AN EXAMPLE

我想要的是:这是示例 1,这是示例 2。

我怎样才能做到这一点?任何帮助表示赞赏!

【问题讨论】:

  • 在同一个字符串中是否存在超过 1 个数字的情况?

标签: r dplyr stringr gsub


【解决方案1】:

您可以使用gregexprregmatches

s <- c("THIS IS 1 AN EXAMPLE", "THIS 2 IS AN EXAMPLE", "THIS 2 IS AN 3 EXAMPLE")

x <- gregexpr(" *\d+", s)
y <- regmatches(s, x)
regmatches(s, x) <- ""
paste0(s, sapply(y, paste0, collapse = ""))
#[1] "THIS IS AN EXAMPLE 1"   "THIS IS AN EXAMPLE 2"   "THIS IS AN EXAMPLE 2 3"

【讨论】:

    【解决方案2】:

    parse_number

    library(readr)
    library(dplyr)
    
    df <- tibble(a = c("THIS IS 1 AN EXAMPLE", "THIS 2 IS AN EXAMPLE"))
    
    df %>% 
      mutate(a = paste(sub("\d+ ", "", a), parse_number(a)))
    # A tibble: 2 × 1
      a                   
      <chr>               
    1 THIS IS AN EXAMPLE 1
    2 THIS IS AN EXAMPLE 2
    

    如果您有更多号码使用stringr

    library(dplyr)
    library(stringr)
    
    df <- tibble(a = c("THIS IS 1 AN EXAMPLE", "THIS 2 IS AN EXAMPLE",
     "THIS 223 IS AN 3 EXAMPLE"))
    
    df %>% 
      mutate(a = paste(gsub("\d+ ", "", a), sapply(a, function(x) 
        paste(str_extract_all(x, "\d+")[[1]], collapse=" "))))
    # A tibble: 3 × 1
      a                       
      <chr>                   
    1 THIS IS AN EXAMPLE 1    
    2 THIS IS AN EXAMPLE 2    
    3 THIS IS AN EXAMPLE 223 3
    

    【讨论】:

      【解决方案3】:

      如果您的目标是检测 gsub 模式中的所有部分,使用三个单独的括号来表示匹配前、匹配和匹配后部分,应该非常简单:

      library(tidyverse)
      
      tibble(a = c("THIS IS 1 AN EXAMPLE", "THIS 2 IS AN EXAMPLE")) |> 
        mutate(a = gsub("(.*)( \d )(.*)", "\1 \3\2", a))
      #> # A tibble: 2 × 1
      #>   a                      
      #>   <chr>                  
      #> 1 "THIS IS AN EXAMPLE 1 "
      #> 2 "THIS IS AN EXAMPLE 2 "
      

      【讨论】:

      • 太感谢了!!
      • 您可能希望使用 \d{1,2} 来计算两位数。
      • 我会选择 \d+ 作为“一个或多个数字”,但两者都可以。只要字符串中只有一个数字!
      【解决方案4】:

      使用str_removestr_extract 是另一种选择(易于阅读/掌握):

      library(stringr)
      library(dplyr)
      
      df |>
        mutate(a = paste(str_remove(a, "\d+ "), str_extract(a, "\d+")))
      

      输出:

      # A tibble: 2 × 1
        a                   
        <chr>               
      1 THIS IS AN EXAMPLE 1
      2 THIS IS AN EXAMPLE 2
      

      数据:

      df <- 
        tibble(a = c("THIS IS 1 AN EXAMPLE", 
                     "THIS 2 IS AN EXAMPLE"))
      

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 1970-01-01
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2011-01-04
        • 1970-01-01
        相关资源
        最近更新 更多