【问题标题】:Extract just the number from string仅从字符串中提取数字
【发布时间】:2021-07-18 22:24:48
【问题描述】:

如何仅从以下数据框中提取数字。

last_run<-c('Last run 15 days ago','1st up after 126 days','Last run 21 days ago',
            'Last run 22 days ago','1st up after 177 days','1st up after 364 days')%>%
  as.data.frame()

想要的输出是:

我的尝试是:

new_df<-sapply(str_split(last_run$last_run," run"|"after"),'[',2)%>%
  as.data.frame()

【问题讨论】:

  • this previous post 回答你的问题了吗?
  • 类似Ronak的回答,往前看可以申请as.numeric(str_extract(last_run$., '\\d+(?= days)'))

标签: r regex split extract sapply


【解决方案1】:
sapply(strsplit(last_run, " "), function(x) na.omit(as.numeric(x)))

strsplit

它将解析 last_run 并返回一个列表,其中每个元素都是一个字符向量,其中句子分成单词

> strsplit(last_run, " ")
[[1]]
[1] "Last" "run"  "15"   "days" "ago" 

[[2]]
[1] "1st"   "up"    "after" "126"   "days" 

[[3]]
[1] "Last" "run"  "21"   "days" "ago" 

[[4]]
[1] "Last" "run"  "22"   "days" "ago" 

[[5]]
[1] "1st"   "up"    "after" "177"   "days" 

[[6]]
[1] "1st"   "up"    "after" "364"   "days" 

as.numeric

它会尝试将单词转换成数字,如果不可行则返回NA

> as.numeric(strsplit(last_run, " ")[[1]])
[1] NA NA 15 NA NA

na.省略

它将从向量中删除 NA

na.omit(as.numeric(strsplit(last_run, " ")[[1]]))[[1]]
[1] 15

na.omit返回一个列表,没有NA的向量是列表的第一个元素(这就是为什么,你需要[[1]]


应用

sapply 对列表的每个元素应用一个函数并返回一个向量

【讨论】:

    【解决方案2】:

    您可以借助正则表达式。提取单词'run''after' 后面的数字。使用基础 R sub

    as.numeric(sub('.*(run|after)\\s(\\d+).*', '\\2', last_run))
    #[1]  15 126  21  22 177 364
    

    使用stringr::str_extract

    as.numeric(stringr::str_extract(last_run, '(?<=(run|after)\\s)\\d+'))
    

    数据

    last_run<-c('Last run 15 days ago','1st up after 126 days','Last run 21 days ago',
                'Last run 22 days ago','1st up after 177 days','1st up after 364 days')
    

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式提取值并将它们添加到 data.frame :

      run = c('Last run 15 days ago','1st up after 126 days','Last run 21 days ago',
        'Last run 22 days ago','1st up after 177 days','1st up after 364 days')
      
      as.numeric(sub("(.* )([[:digit:]]+)( .*)", '\\2', run))
      

      【讨论】:

        【解决方案4】:

        在 base R 或 stringr::str_extract 中,将模式 \\d+ 放在边界标记 \\b 之间,以免捕获像 "1st" 这样的字符串。

        1.基础R

        gsub(".*(\\b\\d+\\b).*", "\\1", last_run)
        #[1] "15"  "126" "21"  "22"  "177" "364"
        
        as.integer(gsub(".*(\\b\\d+\\b).*", "\\1", last_run))
        #[1]  15 126  21  22 177 364
        

        2。包stringr

        stringr::str_extract(last_run, "\\b\\d+\\b")
        #[1] "15"  "126" "21"  "22"  "177" "364"
        
        as.integer(stringr::str_extract(last_run, "\\b\\d+\\b"))
        #[1]  15 126  21  22 177 364
        

        【讨论】:

          猜你喜欢
          • 2019-09-14
          • 2015-10-04
          • 2021-01-08
          • 2021-11-14
          • 2016-12-13
          • 2019-09-26
          • 2021-07-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多