如果我有这个:
2 (5.7%) 34 (8.9%)
我怎样才能只提取出第一个(和%(只是百分比数字)之间的内容?
5.7 8.9
nvbavucw1#
我们可以使用sub来匹配字符(.*)直到左大括号(\\(),捕获不是%([^%]+)的字符作为一个组,并替换为捕获组(\\1)的反向引用
sub
.*
\\(
%
[^%]+
\\1
as.numeric(sub(".*\\(([^%]+).*", "\\1", str1)) [1] 5.7 8.9
或者使用str_extract
str_extract
library(stringr) as.numeric(str_extract(str1, "\\((.*)%", group = 1)) [1] 5.7 8.9
str1 <- c("2 (5.7%)", "34 (8.9%)")
mf98qq942#
为了补充@akrun的回答,我以前遇到过这个问题,并最终使用以下方法“拆分”mean (stdev)或count (proportion%):
mean (stdev)
count (proportion%)
library(tidyverse) df <- data.frame(result = c("2 (5.7%)", "34 (8.9%)")) df #> result #> 1 2 (5.7%) #> 2 34 (8.9%) df %>% mutate(result = str_remove_all(result, "\\(|\\%\\)")) %>% separate(col = result, into = c("count", "proportion (%)"), sep = " ", convert = TRUE) #> count proportion (%) #> 1 2 5.7 #> 2 34 8.9
这会将列转换为“正确的”类型:
str(df) #> 'data.frame': 2 obs. of 2 variables: #> $ count : int 2 34 #> $ proportion (%): num 5.7 8.9
wmomyfyw3#
只是为了好玩:
library(readr) library(stringr) parse_number(str_replace(str1, paste(parse_number(str1), collapse = "|"), ''))
[1] 5.7 8.9
3条答案
按热度按时间nvbavucw1#
我们可以使用
sub
来匹配字符(.*
)直到左大括号(\\(
),捕获不是%
([^%]+
)的字符作为一个组,并替换为捕获组(\\1
)的反向引用或者使用
str_extract
数据
mf98qq942#
为了补充@akrun的回答,我以前遇到过这个问题,并最终使用以下方法“拆分”
mean (stdev)
或count (proportion%)
:这会将列转换为“正确的”类型:
wmomyfyw3#
只是为了好玩: