在 R 编程语言中通过观察对数据进行分组后是否可以对数据进行排名?

Is it possible to rank data after grouping it by observations in R Programming language?

我有美国所有医院的某些属性的数据。代表性样本可能如下所示:

  Hospital.Name    State       HA      HF      PN    Rank
1    HOSPITAL 1       NY     10.1     7.1     7.7       1
2    HOSPITAL 2       PA     10.4    11.2    11.6       2
3    HOSPITAL 3       SD     10.5     9.9    11.6       3
4    HOSPITAL 4       CA     10.5     8.4     9.7       4
5    HOSPITAL 5       CT     10.6    11.9    11.8       5
6    HOSPITAL 6       PA     10.7     8.3    10.9       6

上面显示的数据已经部分处理 - 按属性 "HA" 排列和排名,并添加了一列 ("Rank") 以反映这一点。

然而,这不是我需要的。我正在尝试根据这些属性对按州分组的数据进行排名。

所以,最终输出会有点像下面这样:

  Hospital.Name    State       HA      HF      PN    Rank
1    HOSPITAL 1       AK     12.1     7.1     7.7       1
2    HOSPITAL 2       AK     12.4    11.2    11.6       2
3    HOSPITAL 3       AK     14.5     9.9    11.6       3
4    HOSPITAL 4       AL     11.5     8.4     9.7       1
5    HOSPITAL 5       AL     15.6    11.9    11.8       2
6    HOSPITAL 6       AL     16.7     8.3    10.9       3

请注意,特定州排名 1 的属性值 "HA" 可能高于或低于另一个州排名 1 的属性 HA 值。本质上,属性 "HA" 在状态中的等级是独立的。

到目前为止,我已经尝试在 mutate 函数中使用 order 和 rank 函数。但是,两者都会抛出以下错误:

Error: incompatible size (%d), expecting %d (the group size) or 1

我怎样才能达到我所需要的?非常感谢任何帮助/指导/建议。

**请注意,我有所有 50 个州 运行 的数千行数据,上面 table 1 中显示的只是代表性数据。

此外,请注意上面 Table 2 中的数据是所需输出的样本,而不是整个输出。 **

这是一个使用 ave() 的解决方案(注意:我将行顺序随机化以证明它不依赖于输入中的任何特定行顺序):

set.seed(317);
df <- data.frame(Hospital.Name=c('HOSPITAL 1','HOSPITAL 2','HOSPITAL 3','HOSPITAL 4','HOSPITAL 5','HOSPITAL 6'), State=c('AK','AK','AK','AL','AL','AL'), HA=c(12.1,12.4,14.5,11.5,15.6,16.7), HF=c(7.1,11.2,9.9,8.4,11.9,8.3), PN=c(7.7,11.6,11.6,9.7,11.8,10.9) )[sample(6),];
df$Rank <- ave(df$HA,df$State,FUN=function(x) match(1:length(x),order(x)));
df;
##   Hospital.Name State   HA   HF   PN Rank
## 3    HOSPITAL 3    AK 14.5  9.9 11.6    3
## 1    HOSPITAL 1    AK 12.1  7.1  7.7    1
## 6    HOSPITAL 6    AL 16.7  8.3 10.9    3
## 4    HOSPITAL 4    AL 11.5  8.4  9.7    1
## 2    HOSPITAL 2    AK 12.4 11.2 11.6    2
## 5    HOSPITAL 5    AL 15.6 11.9 11.8    2

这是另一个使用 dplyr 的解决方案。您可以按州分组,然后进行排名:

dt <- data.table(Hospital.Name = "Hospital", 
           State = rep(c("AK", "AL"), each = 2), 
           HA = c(10,12,11,14)) 

dt %>% 
  group_by(State) %>%
  mutate(Rank = rank(HA))

输出:

  Hospital.Name State HA Rank
1      Hospital    AK 10    1
2      Hospital    AK 12    2
3      Hospital    AL 11    1
4      Hospital    AL 14    2

再说一下出现的困惑:

rank(dt$HA) 给出一个向量(此处大小为 4),而 rank(HA) 给出一个标量,表示列 HA 中当前行的当前排名(如果指定,也基于组)。