Получение интервала cut2 для ранее не включенных чисел

#r #quantile

#r #квантиль

Вопрос:

На самом деле, я решил этот вопрос, но у меня есть проблемы, потому что решение состоит из двух шагов, которые действительно разделены друг от друга (первый шаг находится внутри функции, а второй шаг — внутри другого; это означало бы, что я должен сделать H в качестве вывода).

Во-первых, воспроизводимый пример:

 RN = rnorm(n=1000,10,20)
H = cut2(RN,g=4,onlycuts=FALSE) # Step 1: The intervals are generated
H2= cut2(RN,g=4,onlycuts=TRUE) # Step 1: (This would be useful if Step 1 and 2 were not separated)
new_number = 10.53 # Step 2: New number
interval_new_number = cut2(new_number,cuts=H) # Step 2: Interval for new number
  

Я хотел бы знать решение, которое может быть выполнено как:

 new_number %in% H
  

Выскажите мне свое мнение.

Ответ №1:

Я (думаю) запрос предназначен для определения номера интервала для нового значения относительно вектора факторов, построенного с помощью cut2. Если это то, что необходимо, тогда используйте as.numeric для построения gsub первого из двух сокращений на каждом уровне фактора:

 H = cut2(RN,g=4,onlycuts=FALSE)
attributes(H)
#----
$class
[1] "factor"

$levels
[1] "[-66.7,-2.4)" "[ -2.4,10.3)" "[ 10.3,23.7)" "[ 23.7,75.9]"

findInterval( 10.53, as.numeric( gsub( "\[|\,. $","", levels(H) ) ) )
[1] 3
  

Я никогда не видел onlycuts , чтобы параметр использовался раньше, но это сделало бы код еще проще, поскольку as.numeric( gsub(...)) вызовы не понадобились бы:

 > (H2 = cut2(RN,g=4,onlycuts=TRUE) )
[1] -66.687208  -2.397688  10.334926  23.659386  75.887076
> findInterval( 10.53, H2 )
[1] 3
  

Комментарии:

1. Это значение будет отсутствовать, но findInterval все равно даст правильный результат для любых числовых значений в интервале [ 23.7,75.9] . Единственное значение, при котором findInterval давал бы разные результаты, было бы, если бы тестовое значение было на уровне или выше 75,9. Если вам нужно сохранить максимальное значение из сокращений, используйте onlycuts=TRUE стратегию.

2. Это последнее значение в векторе, возвращаемое cut2(RN,g=4,onlycuts=TRUE)

3. Вам нужно будет написать еще один вызов gsub, который «стирает» все, вплоть до запятой, а также удаляет завершающий «]», а затем применить as.numeric к нему.

4. as.numeric( gsub( ". \,|\]","", tail(levels(H),1) ) )

5. Как меня отблагодарить? Вы должны найти кучу ответов Г. Гротендика, которые включают вопросы с регулярными выражениями, и проголосовать за них. Я изучил регулярное выражение, разбирая и играя с его ответами на Rhelp.