Сортировка по строкам для получения трех самых больших значений - PullRequest
0 голосов
/ 05 февраля 2019

Существует оценка травмы, называемая Оценка ISS

У меня есть таблица данных травм в строках в соответствии с номером удостоверения личности.

Я хотел бы получить верхнюютри значения для 6 столбцов травм.

Значения столбцов варьируются от 0 до 5.

pt_id head face abdo pelvis Extremity External
1    4    0    0    1    0    3
2    3    3    5    0    3    2
3    0    0    2    1    1    1
4    2    0    0    0    0    1
5    5    0    0    2    0    1

Мой вывод для приведенного выше примера будет

pt-id n1 n2 n3
1    4    3    1
2    5    3    3
3    2    1    1
4    2    1    0
5    5    2    1

значения могутбыть в списке или в новых столбцах, так как с этого момента подсчет баллов прост.

Я думал, что смогу создать список для 6 столбцов травм, а затем применить сортировку к каждому списку, принимая три верхние значения.Мой код для этого был:

ais$ais_list <- setNames(split(ais[,2:7], seq(nrow(ais))), rownames(ais))

Но я изо всех сил пытался применить сортировку к спискам во фрейме данных, поскольку, к сожалению, некоторые данные в моем наборе данных содержат значения NA

1 Ответ

0 голосов
/ 05 февраля 2019

Мы могли бы использовать apply построчно и sort кадр данных и принимать только первые три значения в каждой строке.

cbind(df[1], t(apply(df[-1], 1, sort, decreasing = TRUE)[1:3, ]))

#  pt_id 1 2 3
#1     1 4 3 1
#2     2 5 3 3
#3     3 2 1 1
#4     4 2 1 0
#5     5 5 2 1

Поскольку некоторые значения могут содержать NA, лучше нам apply sort с использованием анонимной функции, а затем принять верхние 3 значения с помощью head.

cbind(df[1], t(apply(df[-1], 1, function(x) head(sort(x, decreasing = TRUE), 3))))

A tidyverse - сначала gather данные, arrange этов порядке убывания и для каждой строки выберите только первые три значения.Затем мы заменяем столбец injury на имена столбцов, которые нам нужны, и, наконец, spread возвращаем данные в широкоформатный формат.

library(tidyverse)

df %>%
  gather(injury, value, -pt_id) %>%
  arrange(desc(value)) %>%
  group_by(pt_id) %>%
  slice(1:3) %>%
  mutate(injury = 1:3) %>%
  spread(injury, value)

#  pt_id   `1`   `2`   `3`
#  <int> <int> <int> <int>
#1     1     4     3     1
#2     2     5     3     3
#3     3     2     1     1
#4     4     2     1     0
#5     5     5     2     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...