【问题标题】:Rank a sorted dataset using apply function使用 apply 函数对已排序的数据集进行排名
【发布时间】:2014-09-12 08:18:14
【问题描述】:

我的数据框如下所示:

head(temp$HName)

[1] "UNIVERSITY OF TEXAS HEALTH SCIENCE CENTER AT TYLER"
[2] "METHODIST HOSPITAL,THE"                            
[3] "TOMBALL REGIONAL MEDICAL CENTER"                   
[4] "METHODIST SUGAR LAND HOSPITAL"                     
[5] "GULF COAST MEDICAL CENTER"                         
[6] "VHS HARLINGEN HOSPITAL COMPANY LLC"   

head(temp$Rate)

[1] 7.3 8.3 8.7 8.7 8.8 8.9
76 Levels: 7.3 8.3 8.7 8.8 8.9 9 9.1 9.2 9.3 9.4 9.5 9.6 ... 17.1

> head(temp$Rank)
[1] NA NA NA NA NA NA

temp$Rate 已排序。我正在尝试编写一个函数assignRank,它为我提供了一个新列temp$Rank,其值为1、2、3、3、4、5

我的代码如下:

tapply(temp$Rank,temp$Rate, assignRank)

在哪里:

    assignRank<- function(r=1){
      temp$Rank <- r
      r <- r + 1
      return(r)
    }

运行tapply时出现以下错误

   tapply(temp$Rank,temp$Rate, assignRank)
 Show Traceback

 Rerun with Debug
 Error in `$<-.data.frame`(`*tmp*`, "Rank", value = c(NA, NA)) : 
  replacement has 2 rows, data has 301 

请告知我哪里出错了?

【问题讨论】:

  • 为什么不用R的rank函数?
  • 嗨罗兰! rank 函数具有三种处理平局的方法,即第一种、随机和平均。如果我使用“第一”或“随机”,我从文档中了解的排名将我的数据集的第 3 行和第 4 行的排名为 3,4。如果我使用平均值,它将平均这两个值。我想保留绑定元素的等级,在我的示例中为 3,3。

标签: r sorting ranking tapply


【解决方案1】:

我使用data.table 来处理这样的事情,因为排序和排名都是非常有效/简单的语法

library(data.table)
setkey(setDT(temp), Rate) # This will sort your data set by Rate in case it's not yet sorted
temp[, Rank := .GRP, by = Rate]
temp
#                                                 HName Rate Rank
# 1: UNIVERSITY OF TEXAS HEALTH SCIENCE CENTER AT TYLER  7.3    1
# 2:                             METHODIST HOSPITAL,THE  8.3    2
# 3:                    TOMBALL REGIONAL MEDICAL CENTER  8.7    3
# 4:                      METHODIST SUGAR LAND HOSPITAL  8.7    3
# 5:                          GULF COAST MEDICAL CENTER  8.8    4
# 6:                 VHS HARLINGEN HOSPITAL COMPANY LLC  8.9    5

或者您可以使用 base R 轻松地做同样的事情(假设您的数据按排名排序)只是这样做

as.numeric(factor(temp$Rate))
## [1] 1 2 3 3 4 5

或者也可以使用dplyr 包中的dense_rank 函数(这将需要对数据集进行排序)

library(dplyr)
temp %>% 
  mutate(Rank = dense_rank(Rate))
#                                                HName Rate Rank
# 1 UNIVERSITY OF TEXAS HEALTH SCIENCE CENTER AT TYLER  7.3    1
# 2                             METHODIST HOSPITAL,THE  8.3    2
# 3                    TOMBALL REGIONAL MEDICAL CENTER  8.7    3
# 4                      METHODIST SUGAR LAND HOSPITAL  8.7    3
# 5                          GULF COAST MEDICAL CENTER  8.8    4
# 6                 VHS HARLINGEN HOSPITAL COMPANY LLC  8.9    5

【讨论】:

  • 谢谢大卫。这很有帮助。
【解决方案2】:

其他选项(如果数据已排序)

with(temp, cumsum(ave(Rate, Rate, FUN=function(x) c(1,x[-1]!=x[-length(x)]))))
#[1] 1 2 3 3 4 5



 with(temp, match(Rate, unique(Rate)) )
#[1] 1 2 3 3 4 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多