提问人:Hack-R 提问时间:5/13/2014 最后编辑:Paulo E. CardosoHack-R 更新时间:12/1/2017 访问量:808
如何选择每列列中的前 2 个值,并使用值和行名进行报告?
How can I select the top 2 values in a column per column and report this with both values and row names?
问:
我有一个矩阵的列,其中包含用户唯一 ID 的名称。列中的每一行都表示基于预测风险的回归模型的风险因素评分。我想报告每个人的前 2 个风险因素(代表因素和实际值的行名)以及他们的 ID。
我寻找了解决方案,发现了很多险些失误。例如,如果我只想要没有行名的前 1 个值,并且我没有个人作为列,那么我认为我可以使用 .max
sort(x,partial=n-1)[n-1]
我的数据如下所示:
ID.H00034222 ID.H00034305
a.score 0.040093810 0.04009381
b.score -0.038265220 -0.03826522
c.score 0.044418130 0.04441813
d.score -0.418624640 -0.05656504
e.score -0.005192439 0.10851938
f.score 0.005026030 0.02174170
df <- structure(c(0.04009381, -0.03826522, 0.04441813, -0.41862464,
-0.005192439, 0.00502603, 0.04009381, -0.03826522, 0.04441813,
-0.05656504, 0.10851938, 0.0217417), .Dim = c(6L, 2L), .Dimnames = list(
c("a.score", "b.score", "c.score", "d.score", "e.score",
"f.score"), c("ID.H00034222", "ID.H00034305")))
我的输出应该给出一个用户 ID,以及每个 ID 的最高 2 行名称和值。
答:
4赞
Stephan Kolassa
5/13/2014
#1
一些玩具数据:
> foo <- matrix(rnorm(80),nrow=20,dimnames=list(letters[1:20],LETTERS[23:26]))
> foo
W X Y Z
a 1.3550138 1.35438637 0.43150124 -0.7087100
b -1.3200136 -0.82764303 -0.01480796 2.2399561
c -1.0018050 -0.04941702 -2.46454058 0.2516673
d 0.7877259 0.08713982 1.25948179 1.1901716
e 1.5834800 0.06905996 0.37453295 0.5343909
f 0.3607650 0.22815776 -0.24688689 -0.7784353
g 0.2071689 -0.21987249 -0.38334840 -0.0568370
h 0.7502296 0.61355174 -0.38836131 1.8772838
i -1.1608980 0.75128093 -0.13562930 -1.3183407
j -0.5419957 -0.43251911 -1.91773334 0.8227418
k 1.1222314 -0.52768270 1.13687919 0.2458857
l -0.2158528 -0.43057554 -0.93613664 0.7861322
m 0.2933530 -1.22532466 0.98192839 0.6581522
n -0.6324390 -0.90072134 -1.89817529 -1.4419014
o 0.6956912 1.28457179 0.65234730 0.6524573
p -1.4979845 -0.23898356 1.82825548 -0.1819744
q 1.5459565 0.38683197 -1.23645565 1.0340520
r -1.3844880 0.05111238 -0.51715069 -0.1702139
s -2.1096706 0.46527795 -1.13718323 0.8133859
t -1.5700089 0.09305299 2.33807078 0.8382010
提取每列的前两个值:
> apply(foo,2,function(xx)tail(sort(xx),2))
W X Y Z
[1,] 1.545957 1.284572 1.828255 1.877284
[2,] 1.583480 1.354386 2.338071 2.239956
提取每列前两个值的名称:
> apply(foo,2,function(xx)tail(names(sort(xx)),2))
W X Y Z
[1,] "q" "o" "p" "h"
[2,] "e" "a" "t" "b"
>
评论