Как эффективно классифицировать большой целочисленный вектор в R - PullRequest
0 голосов
/ 06 февраля 2020

У меня большой целочисленный вектор (часть данных показана ниже):

a <- c(0,0,0,1,1,2,2,2,4,4,7,7,7,35,50,50, 200,200,500,500,500, 2500,2501,2502,2502)

Я хотел бы создать еще один вектор (вектор b), который классифицирует значения вектора a на ячейки. Значения категорий должны быть 1 для вектора a, значения 0 - 6, 2 для 7 - 13, 3 для 14 - 20 ...

Я знаю, что могу использовать функцию dplyr case_when() для изменения, но когда данные большие, они могут быть неэффективными.

1 Ответ

3 голосов
/ 06 февраля 2020

Наилучшим способом классификации числовых данных c по диапазонам с выходным значением числительного c является функция findInterval. Примеры:

> a <- c(0,0,0,1,1,2,2,2,4,4,7,7,7,35,50,50, 200,200,500,500,500, 2500,2501,2502,2502)
> findInterval( a, c(0, 6, 12, 18, 24))
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5
> findInterval( a, 6^(0:6))
 [1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 5 5 5 5
> 6^(0:6)
[1]     1     6    36   216  1296  7776 46656

Обратите внимание, что значение, возвращаемое для элементов ниже минимального значения во втором аргументе, равно 0, а значение для элементов выше максимального - это длина вектора vec (т.е. разрывы). Интервалы закрыты слева, справа открыты, что противоположно поведению функции cut (если не изменено параметрами).

...