相关问题,这里是R/dplyr: How to only keep integers in a data frame?,这里是R extract first number from string,但这试图捕捉到一些社会科学中相对常见的案例。
假设下面的例子中的数据是文本和数字在一个字段中的混合。也许是一些调查过程的结果。您希望可靠地提取所有数字并忽略文本,但是如果有多个数字,您可能希望使用mean或median或其他一些数字函数来获得一个“最佳”答案。
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)发布于 2020-06-04 09:10:52
尽管我知道可以使用其他正则表达式和base工具来解决问题,但我还是要介绍一个tidyverse解决方案。替换许多其他数字运算符(如median )很简单,而且无论找到多少个数字,此解决方案都将有效。
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发布于 2020-06-04 09:24:59
您不需要检查提取的数字的长度,因为1个数字的mean/median/sum是相同的数字。
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执行此操作,请执行以下操作:
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.0https://stackoverflow.com/questions/62185220
复制相似问题