【问题标题】:R: how to rank longitudinal dataR:如何对纵向数据进行排序
【发布时间】: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") 这样的东西比人为地夸大最后的排名更有意义。

标签: r ranking


【解决方案1】:

一种选择是使用 sapply 循环遍历 'df1' 的列并获取值大于 1 的第一个位置。如果没有大于 1 的值,它将是 NA .然后,我们得到“indx”的rank,将ties.method指定为min(“indx1”)。最后一步将 'indx' 中 NA 值的位置替换为 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

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2011-05-16
    • 2023-03-19
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多