Преобразовать факторы в масштабированные значения - PullRequest
2 голосов
/ 18 июня 2019

У меня есть данные командного зачета, где в столбце есть записи в форме «X числа Y». Мне нужно преобразовать их в числовые значения по шкале от 0 до 1, где 1 - 1, последний - 0, а остальные - в линейном масштабе. Я рассмотрел strsplit (), но не знаю, что делать, если кто-то «первый», кто-то «второй» и т. Д. Например, мои данные выглядят как

x = as.factor(c('2nd of 6', '5th of 5', '4th of 5', '3rd of 5', '5th of 5', '4th of 7'))

Примечание: '2nd of 6' должен конвертироваться в 0.8, а не в 0.6666667

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Мы можем извлечь числа из строки, разделить их и создать последовательность от 0 до 1, длина которой определяется вторым числом, и установить подмножество первого числа из этой последовательности.

sapply(strsplit(sub("^(\\d+)(?:st|nd|rd|th) of (\\d+).*", "\\1-\\2", x), "-"), 
   function(x)  1 - seq(0, 1, length.out = as.integer(x[2]))[as.integer(x[1])])

#[1] 0.80 0.00 0.25 0.50 0.00 0.50
1 голос
/ 18 июня 2019

Обновление

ОП ранее не упоминала ожидаемый результат.Итак, мы меняем вывод, основываясь на комментариях к другому сообщению.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...