排序跨行获得三个最大值

问题描述 投票:0回答:1

有一个叫ISS score一个损伤评分

我根据PT ID有伤的数据表中的行。

我想获得的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值

r
1个回答
1
投票

我们可以使用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使用匿名函数,然后采取使用head取前3名的值。

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

一个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
© www.soinside.com 2019 - 2024. All rights reserved.