С еще одним требованием - чтобы результирующий вектор был в том же порядке, что и оригинал.
У меня есть очень простая функция, которая перцентирует вектор и работает так, как я хочу:
ptile <- function(x) {
p <- (rank(x) - 1)/(length(which(!is.na(x))) - 1)
p[p > 1] <- NA
p
}
data <- c(1, 2, 3, 100, 200, 300)
Например, ptile(data)
генерирует:
[1] 0.0 0.2 0.4 0.6 0.8 1.0
Что я действительно хотел бы сделать, так это использовать эту же функцию (ptile) и заставить ее работать в уровняхфактора.Итак, предположим, что у меня есть «коэффициент» f следующим образом:
f <- as.factor(c("a", "a", "b", "a", "b", "b"))
Я хотел бы иметь возможность преобразовать «данные» в вектор, который говорит мне, для каждого наблюдения, что его соответствующий процентиль является относительнымк другим наблюдениям в пределах того же уровня, как это:
0.0 0.5 0.0 1.0 0.5 1.0
Как выстрел в темноте, я попытался:
tapply(data,f,ptile)
и вижу, что на самом деле это удаетсяделает ранжирование / процентилирование, но делает это так, что я понятия не имею, какие наблюдения соответствуют их показателям в исходном векторе:
[1] a a b a b b
Levels: a b
> tapply(data,f,ptile)
$a
[1] 0.0 0.5 1.0
$b
[1] 0.0 0.5 1.0
Это важно, потому что фактические данные, с которыми я работаю, могуту меня 1000-3000 наблюдений (запасы) и 10-55 уровней (такие как сектора, группировки по другим характеристикам запаса и т. д.), и мне нужно, чтобы результирующий вектор был в том же порядке, в каком он был, для всегоВыстраиваться в ряд, строка за строкой в моей матрице.
Есть ли какой-нибудь вариант применения, который бы делал то, что я ищу?Или несколько быстрых строк, которые бы сработали?Я написал эту функциональность на C # и F # с гораздо большим количеством строк кода, но понял, что в R должно быть какое-то действительно прямое, элегантное решение.Есть ли?
Заранее спасибо!