понимание вывода функции "порядок" в R - PullRequest
0 голосов
/ 26 января 2020

Учитывая этот фрейм данных:

names <- c("Anna", "Bella", "Christian", "Derrick", "Emma")
scores <- c(10,5,10,9,8)
age <- c(16,16,17,18,21)
test <- data.frame(cbind(names,scores, age))

I wi sh, чтобы создать переменную, которая ранжируется по оценкам и использует имен по состоянию на ie то есть, хотя Анна и Кристиан оба набрали 10 баллов, ранг Анны == 1 и Кристиана == 2

мой код: test$rank_by_score <- order(test$scores, test$names, decreasing = T)

токовый выход:

names      scores   age   rank_by_score
Anna       10       16    4
Bella      5        16    5
Christian  10       17    2
Derrick    9        18    3
Emma       8        21    1

желаемый вывод:

names      scores   age   rank_by_score
Anna       10       16    1
Bella      5        16    5
Christian  10       17    2
Derrick    9        18    3
Emma       8        21    4

Что происходит с моим текущим выводом и как мне добраться до желаемого результата?

редактирование для отображения вывода, когда возраст и баллы кодируются как целые числа, а не как факторы

names      scores   age   rank_by_score
Anna       10       16    3
Bella      5        16    1
Christian  10       17    4
Derrick    9        18    5
Emma       8        21    2

1 Ответ

0 голосов
/ 26 января 2020

Я думаю, что вы ищете rank вместо order, но rank может принимать только одно значение столбца. Таким образом, мы можем сначала order данные, основанные на names, а затем использовать rank.

test <- test[order(test$names), ]

rank(-test$scores, ties.method = "first")
#[1] 1 5 2 3 4

См. ?rank для различных ties.method вариантов. Если мы используем ties.method = "first", когда есть в ie небольшая цифра присваивается записи, которая появляется первой и противоположной, когда ties.method = "last".

rank(-test$scores, ties.method = "last")
#[1] 2 5 1 3 4

order возвращает индексы оригинала вектор в отсортированном порядке.

a1 <- order(test$scores, decreasing = TRUE)
a1
#[1] 1 3 4 5 2

a2 <- test$scores
a2
#[1] 10  5 10  9  8

Здесь вывод order можно интерпретировать как a2[a1[1]] (10) - наибольшее число, за которым следуют a2[a1[2]] (10) и a2[a1[3]] (9) и так далее.

данные

names <- c("Anna", "Bella", "Christian", "Derrick", "Emma")
scores <- c(10,5,10,9,8)
age <- c(16,16,17,18,21)
test <- data.frame(names, scores, age)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...