【发布时间】:2015-08-02 22:14:13
【问题描述】:
> dput(subset)
structure(list(MEMORY1 = c(1L, 1L, 1L, 1L, 2L), MEMORY2 = c(1L,
1L, 1L, 1L, 1L), MEMORY3 = c(1L, 2L, 1L, 1L, 1L), MEMORY4 = c(2L,
2L, 2L, 2L, 2L), MEMORY5 = c(1L, 2L, 1L, 2L, 1L), MEMORY6 = c(1L,
1L, 2L, 1L, 2L), MEMORY7 = c(2L, 2L, 2L, 2L, 1L), MEMORY8 = c(1L,
1L, 1L, 1L, 1L)), .Names = c("MEMORY1", "MEMORY2", "MEMORY3",
"MEMORY4", "MEMORY5", "MEMORY6", "MEMORY7", "MEMORY8"), row.names = c(NA,
-5L), class = "data.frame")
> subset
MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8
1 1 1 1 2 1 1 2 1
2 1 1 2 2 2 1 2 1
3 1 1 1 2 1 2 2 1
4 1 1 1 2 2 1 2 1
5 2 1 1 2 1 2 1 1
我的数据有 8 个项目(列)以 5 个时间间隔(行)记录。我想按如下方式对数据进行排名:1)如果列全为 1,则该列的排名为 8。2)列的排名取决于第一次出现大于 1 的数字的时间(对于 MEMORY1,它将是 5, MEMORY3 为 2,MEMORY4 为 1,以此类推)。为此,我编写了以下循环。
ranks = rep(0, 8)
for(i in 1:8){
v = which(subset[i] > 1)
if(length(v) == 0){
ranks[i] = 8
}else ranks[i] = v[1]
}
> ranks
[1] 5 8 2 1 2 3 1 8
工作正常,但我意识到由于存在联系,即 MEMORY4 和 MEMORY7 都排名为 1,那么我希望 MEMORY3 和 MEMORY5 排名为 3 而不是 2。在这种情况下,MEMORY6 应该排名为 5 ,而不是 3。所以期望的排名应该是。
6 8 3 1 3 5 1 8
【问题讨论】:
-
3ranks;除非你指的是我想要的排名应该是什么? -
我认为提出一个几乎不连贯的问题然后有一个不正确的“答案”是没有用的。
-
这真是一个奇怪的
ranking。这是一个最低等级,一端有一个最高等级。也许像rank(sapply(data.frame(rbind(dat > 1, TRUE)),which.max),ties.method="min")这样的东西比人为地夸大最后的排名更有意义。