R:如何对纵向数据进行排名

时间:2015-08-02 22:14:14

标签: r ranking

> 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

我的数据有5个时间间隔(行)记录的8个项目(列)。我想按如下方式对数据进行排名: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

1 个答案:

答案 0 :(得分:0)

一种选择是遍历< df1'的列。使用sapply并获取值大于1的第一个位置。如果没有大于1的值,则它将为NA。然后,我们得到了' indx'的rank。将ties.method指定为min(' indx1')。 NA值在< indx'中的位置被8替换为最后一步。

 indx <- sapply(df1, function(x) which(x>1)[1L])
 indx1 <- as.vector(rank(indx, ties.method='min'))
 indx1[is.na(indx)] <- 8
 indx1
 #[1] 6 8 3 1 3 5 1 8