Обновление
ОП ранее не упоминала ожидаемый результат.Итак, мы меняем вывод, основываясь на комментариях к другому сообщению.
df1 <- read.csv(text= gsub("\\D+", ",", x), header = FALSE)
1 - unlist(Map(function(x, y) seq(0, 1, length.out = y)[x], df1$V1, df1$V2))
#[1] 0.80 0.00 0.25 0.50 0.00 0.50
Старый
Мы можем использовать base R
, чтобы сделать это в одной строке
1- Reduce(`/`, read.csv(text= gsub("\\D+", ",", x), header = FALSE))
#[1] 0.6666667 0.0000000 0.2000000 0.4000000 0.0000000 0.4285714
Или с strsplit
m1 <- sapply(strsplit(as.character(x), "\\D+"), as.numeric)
1 - m1[1,]/m1[2,]
Или с fread
library(data.table)
fread(text=gsub("\\D+", ",", x))[, 1- Reduce(`/`, .SD)]
#[1] 0.6666667 0.0000000 0.2000000 0.4000000 0.0000000 0.4285714
Или с использованием tidyverse
library(tidyverse)
x %>%
str_replace("\\D+", ",") %>%
tibble(col1 = .) %>%
separate(col1, into = c('col1', 'col2'), convert = TRUE) %>%
reduce(`/`) %>%
-1 *-1
#[1] 0.6666667 0.0000000 0.2000000 0.4000000 0.0000000 0.4285714