有一个叫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值
我们可以使用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