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

时间:2015-05-28 08:08:03

标签: r grouping ranking

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

  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

请注意属性值" HA"对于特定状态的等级1,可以高于或低于另一个状态的等级1的属性HA的值。基本上,状态中属性" HA"的等级是独立的。

所以,到目前为止,我已尝试在mutate函数中使用orderled和rank函数。但是,两者都会引发以下错误:

  

错误:大小不一致(%d),期望%d(组大小)或1

我如何实现我的需要?任何帮助/指导/建议都将受到高度赞赏。

**请注意,我有50个状态的数据,这些状态会运行到数千行,上面表1中显示的只是代表性数据。

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

2 个答案:

答案 0 :(得分: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中当前行的当前排名(如果指定,也基于组)。

答案 1 :(得分:1)

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

const char* end = buffer + chars_read;
const char* ptr = std::find(buffer, end, '\0');

if(ptr == end) {
    // not found
}
else {
    // ptr points to null character
}