首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串中提取数字,然后在创建新列之前将其作为数字进行操作(可选

从字符串中提取数字,然后在创建新列之前将其作为数字进行操作(可选
EN

Stack Overflow用户
提问于 2020-06-04 09:10:52
回答 2查看 38关注 0票数 1

相关问题,这里是R/dplyr: How to only keep integers in a data frame?,这里是R extract first number from string,但这试图捕捉到一些社会科学中相对常见的案例。

假设下面的例子中的数据是文本和数字在一个字段中的混合。也许是一些调查过程的结果。您希望可靠地提取所有数字并忽略文本,但是如果有多个数字,您可能希望使用meanmedian或其他一些数字函数来获得一个“最佳”答案。

代码语言:javascript
复制
library(dplyr)
library(stringr)
library(purrr)
Years <- c("0 to 1 year",
           "5 yrs",
           "About 10 yrs",
           "20 yrs",
           "4 yrs",
           "4-5 yrs",
           "75 to 100 YEARS old",
           ">1 yearsmispelled or whatever")
df <- data.frame(Years)
EN

回答 2

Stack Overflow用户

发布于 2020-06-04 09:10:52

尽管我知道可以使用其他正则表达式和base工具来解决问题,但我还是要介绍一个tidyverse解决方案。替换许多其他数字运算符(如median )很简单,而且无论找到多少个数字,此解决方案都将有效。

代码语言:javascript
复制
library(dplyr)
library(stringr)

df <- df %>% 
  mutate(
    NewYears = str_extract_all(Years, "[0-9]+") %>%
      purrr::map( 
        ~ifelse(
           length(.x) == 1, 
           as.numeric(.x), 
           mean(unlist(as.numeric(.x)))
        )
      )
  )

df
#>                           Years NewYears
#> 1                   0 to 1 year      0.5
#> 2                         5 yrs        5
#> 3                  About 10 yrs       10
#> 4                        20 yrs       20
#> 5                         4 yrs        4
#> 6                       4-5 yrs      4.5
#> 7           75 to 100 YEARS old     87.5
#> 8 >1 yearsmispelled or whatever        1
票数 3
EN

Stack Overflow用户

发布于 2020-06-04 09:24:59

您不需要检查提取的数字的长度,因为1个数字的mean/median/sum是相同的数字。

代码语言:javascript
复制
sapply(stringr::str_extract_all(df$Years, '\\d+'),function(x) mean(as.numeric(x)))
#[1]  0.5  5.0 10.0 20.0  4.0  4.5 87.5  1.0

要使用pipe执行此操作,请执行以下操作:

代码语言:javascript
复制
library(dplyr)
library(stringr)
library(purrr)

df %>%
  mutate(NewYear = str_extract_all(Years, '\\d+'), 
         NewYear = map_dbl(NewYear, ~mean(as.numeric(.x))))


#                          Years NewYear
#1                   0 to 1 year     0.5
#2                         5 yrs     5.0
#3                  About 10 yrs    10.0
#4                        20 yrs    20.0
#5                         4 yrs     4.0
#6                       4-5 yrs     4.5
#7           75 to 100 YEARS old    87.5
#8 >1 yearsmispelled or whatever     1.0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62185220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档