Как получить ранги первой выборки из ранжированных данных

#r #sorting #rank

Вопрос:

У меня есть два образца x и y, и я пытаюсь сравнить их с помощью теста суммы рангов. Для статистики теста я пытаюсь получить сумму рангов первой выборки следующим образом.

 x <- c(1,2,3,4)
y <- c(2,4,5,7)

rank(sort(c(x,y)))
[1]  1.0 2.5 2.5 4.0 5.5 5.5 7.0 8.0
 

Однако я не знаю, как из этого вывести ранги значений первой выборки. Вот что я попробовал

 rank(sort(c(x,y)))[x]
[1] 1.0 2.5 2.5 4.0
 

но он возвращает неправильный ответ, правильный должен быть

  1.0 2.5 4.0 5.5
 

Ответ №1:

Вам не нужно sort связывать x и y вектор. Результат rank(c(x, y)) дает вам ранги x , затем ранги y , так что для получения рангов x вы можете сделать:

 rank(c(x, y))[seq_along(x)]
#> [1] 1.0 2.5 4.0 5.5
 

и чтобы получить звание y , это:

 rank(c(y, x))[seq_along(y)]
#> [1] 2.5 5.5 7.0 8.0
 

Ответ №2:

Мы также можем использовать head на length «x»

 head(rank(c(x, y)), length(x))
[1] 1.0 2.5 4.0 5.5
 

Ответ №3:

Возможно, было бы безопаснее поместить образцы в фрейм данных, чего вы легко можете достичь с stack() помощью .

 (dat <- stack(list(x=x, y=y)))
#   values ind
# 1      1   x
# 2      2   x
# 3      3   x
# 4      4   x
# 5      2   y
# 6      4   y
# 7      5   y
# 8      7   y
 

Затем вы можете выполнить подмножество явно с помощью "x" и "y" , что вы, очевидно, имели в виду.

 with(dat, rank(values)[ind == 'x'])
# [1] 1.0 2.5 4.0 5.5

with(dat, rank(values)[ind == 'y'])
# [1] 2.5 5.5 7.0 8.0