Обработка чисел в символьных строках в R - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий (содержащий цифры) символьный вектор:

nums = c("1, 2", "1, 2, 4", "2, 4", "1, 2, 3, 4, 5", "2, 3, 5", NA, NA, NA, NA)

Я хочу установить алгоритм, который проверяет, если n подмножество элементов в nums содержит n уникальных чисел изатем удалите эти цифры из других элементов.Где n - любое число от 1 до 9.

. В приведенном выше примере, поскольку первые 3 элементы содержат только 3 числа: 1, 2, 4, эти числа должны быть удаленыиз других элементов.Таким образом, результат будет выглядеть следующим образом:

nums = c("1, 2", "1, 2, 4", "2, 4", "3, 5", "3, 5", NA, NA, NA, NA)

Обратите внимание, что это могут быть 2 элементы, имеющие 2 уникальные номера или 4 элементы, имеющие 4 уникальные номера и т. Д.

Я бы хотел сохранить итоговый вывод как вектор символов такой же длины, что и оригинал.

1 Ответ

0 голосов
/ 15 октября 2018

Если я хорошо понимаю, вы можете применить что-то вроде следующего:

library(stringr)
library(readr)
library(purrr)
nums = c("1, 2", "1, 2, 4", "2, 4", "1, 2, 3, 4, 5", "2, 3, 5", NA, NA, NA, NA)

# create a list within each element is a character element of nums
num_into_list <- stringr::str_split(nums, ",")

# convert to numbers
num_into_list <- purrr::map(num_into_list, readr::parse_number)

# collect unique numbers from the nth first subset of the list (example 3)
not_allowed <- unique(unlist(num_into_list[1:3]))

# filter only values on the rest of the subset that doesn't contain
# values in not_allowed vector, using a logical subsetting operation
# inside of  anonymous function (purrr shortcut to create this)   
output_list <- c(num_into_list[1:3],   # first 3 subset are the same
                 purrr::map(num_into_list[4:9], ~ .[!(. %in% not_allowed)]))

# finally convert into a chr vector
output <- unlist(output_list)

Вы можете создать функцию с кодом выше, если параметризовать n-е первое подмножество для создания вектора not_allowed и длинывашего вектора, чтобы затем восстановить список (при пошаговой индексации output_list).

...