R 基于首次发病的排名数据

R 基于首次发病的排名数据,r,algorithm,rank,R,Algorithm,Rank,但是,由于MEMORY1和MEMORY2在时间1和MEMORY3,MEMORY4,MEMORY5和MEMORY7在时间1的值为2,我想将MEMORY1和MEMORY2排在其他四项之前。所以我想要一个如下的输出 ranks = rep(0, items) ranks = sapply(subset, function(x) which(x > 1)[1L]) ranks # MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEM

但是,由于
MEMORY1
MEMORY2
在时间
1
MEMORY3
MEMORY4
MEMORY5
MEMORY7
在时间
1
的值为2,我想将
MEMORY1
MEMORY2
排在其他四项之前。所以我想要一个如下的输出

ranks = rep(0, items)
ranks = sapply(subset, function(x) which(x > 1)[1L])
ranks
# MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8 
#       1       1       1       1       1      NA       1      NA 
因此,1)按第一个开始排序2)将最高值的项目排序为1,次高值的项目排序为2,以此类推


如何完成步骤2)?

这将为您提供以下值:

ranks
# MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8 
#       1       1       2       2       2      NA       2      NA 
wheremax 1[1L]}#您的代码
矩阵(子集)[cbind(其中max,1:ncol(子集))]
[1] 3 3 2 2 2 NA 2 NA
然后您可以获得一个等级:

wheremax <- sapply(subset,function(x) { which(x > 1)[1L] }) #your code
as.matrix(subset)[cbind(wheremax,1:ncol(subset))]
[1]  3  3  2  2  2 NA  2 NA

DTrank这将为您提供以下值:

ranks
# MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8 
#       1       1       2       2       2      NA       2      NA 
wheremax 1[1L]}#您的代码
矩阵(子集)[cbind(其中max,1:ncol(子集))]
[1] 3 3 2 2 2 NA 2 NA
然后您可以获得一个等级:

wheremax <- sapply(subset,function(x) { which(x > 1)[1L] }) #your code
as.matrix(subset)[cbind(wheremax,1:ncol(subset))]
[1]  3  3  2  2  2 NA  2 NA
DTrank首先,获取秩和值:

DTrank <- rank(-as.matrix(subset)[cbind(wheremax,1:ncol(subset))] + wheremax * max(subset), ties.method = "min", na.last = "keep")
[1]  1  1  3  3  3 NA  3 NA
最后一击:

> df
        rank  val memory final
MEMORY1    1   -3      1     1
MEMORY2    1   -3      2     1
MEMORY4    1   -2      4     2
MEMORY5    1   -2      5     2
MEMORY7    1   -2      7     2
MEMORY3    2   -2      3     3
MEMORY6  Inf -Inf      6     4
MEMORY8  Inf -Inf      8     4
最终排名最终排名
[1] 1 1 3 2 2 4 2 4
我真不敢相信它会这么黑。一开始它真的觉得很琐碎。一定有更好的办法

请注意,我稍微更改了您的数据,因为您只有1和NA,因此无法判断代码是否正常工作。

首先,获取秩和值:

DTrank <- rank(-as.matrix(subset)[cbind(wheremax,1:ncol(subset))] + wheremax * max(subset), ties.method = "min", na.last = "keep")
[1]  1  1  3  3  3 NA  3 NA
最后一击:

> df
        rank  val memory final
MEMORY1    1   -3      1     1
MEMORY2    1   -3      2     1
MEMORY4    1   -2      4     2
MEMORY5    1   -2      5     2
MEMORY7    1   -2      7     2
MEMORY3    2   -2      3     3
MEMORY6  Inf -Inf      6     4
MEMORY8  Inf -Inf      8     4
最终排名最终排名
[1] 1 1 3 2 2 4 2 4
我真不敢相信它会这么黑。一开始它真的觉得很琐碎。一定有更好的办法


请注意,我稍微更改了您的数据,因为您只有1和NA,因此无法判断代码是否正常工作。

感谢您的回复,但我要感谢一个子集,如
结构(列表(MEMORY1=c(2L,3L,2L,2L,2L,2L),MEMORY2=c(2L,2L,2L,3L),MEMORY4=c(3L,3L,3L,3L),MEMORY5=c(2L,2L,2L,2L,4L),MEMORY6=c(1L,2L,1L,1L),MEMORY7=c(2L,3L,2L,3L),MEMORY8=c(2L,3L,1L,2L)),.Names=c(“MEMORY1”,“MEMORY2”,“MEMORY3”,“MEMORY4”,“MEMORY5”,“MEMORY6”,“MEMORY7”,“MEMORY8”),row.Names=c(NA,--4L),class=“data.frame”)
第6项应该排在最后,因为它的第一次出现时间比其他项晚。然而,这并没有反映在你的建议中。@Adrian对不起我的错误,我错过了那个细微差别。编辑以反映感谢您的回复,但对于一个子集,如
结构(列表(MEMORY1=c(2L,3L,2L,2L,2L,1L),MEMORY2=c(2L,2L,1L,1L),MEMORY3=c(2L,2L,2L,2L,3L),MEMORY4=c(3L,3L,3L,3L),MEMORY5=c(2L,2L,2L,4L),MEMORY6=c(1L,2L,2L,1L,1L),MEMORY7=c(2L,3L,3L,3L),MEMORY8,3L),3L),3L,3L=c,3L,3L=c)(“MEMORY1”、“MEMORY2”、“MEMORY3”、“MEMORY4”、“MEMORY5”、“MEMORY6”、“MEMORY7”、“MEMORY8”,row.names=c(NA,-4L),class=“data.frame”)
第6项应该排在最后,因为它的第一次出现时间比其他项晚。但是这没有反映在您的建议中。@阿德里安,对不起,我错了,我错过了这个细微差别。编辑为reflect,就像在
rank\u和\u val
中首先组织信息一样,但我想将相同的排名分配给具有相同排名的项目和
rank\u和
中的值,因此本质上我想为
MEMORY1
MEMORY2
分配一个1的等级。我该怎么做呢?@Adrian编辑了我的答案,现在它可以做你想做的事情了我喜欢先在
rank\u和
中组织信息的想法,但我想给具有相同等级的项目在
rank\u和
中的秩和值相同,因此本质上我想为
MEMORY1
MEMORY2
分配一个秩为1的值。我该怎么做呢?@Adrian编辑了我的答案,现在它满足了你的要求