在 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 中当前行的当前排名(如果指定,也基于组)。
我有美国所有医院的某些属性的数据。代表性样本可能如下所示:
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 中当前行的当前排名(如果指定,也基于组)。