如何在R中按组排序列

时间:2015-02-21 18:37:13

标签: r

我有一个data.frame(比如" df")如下所示:

Hospital.Name | State | Mortality.Rate
'hospital_1'   | 'AA'  | 0.2
'hospital_2'   | 'AA'   | 0.3
'hospital_3'   | 'BB'  | 0.3
'hospital_4'   | 'CC'  | 0.5

(Hospital.Name是唯一的)

现在我想订购" Mortality.Rate" group by" State&#34 ;,即在某个州内订购费率。如果费率有关系,那么" Hospital.Name"用来解决关系。

" order()"和" tapply()"功能浮现在我脑海中。我这样编码:

tapply(df$Mortality.Rate, df$State, order, df$Hospital.Name, na.last=NA)

然而,错误"参数长度不同"弹出。当"命令"函数应用于切片" Rate",订单的第二个参数(即df $ Hospital.Name)未被切片。

我怎样才能将第二个参数(对于排序中的并列解决方案)传递给tapply(),还是有其他方法?

5 个答案:

答案 0 :(得分:8)

在基础R中,您可以为order()提供多个参数,后续参数用于破坏早期变量中的关系,如:

df[order(df$State,df$Mortality.Rate,df$Hospital.Name),]

答案 1 :(得分:5)

你可以在dplyr

中完成
df %>% group_by(State) %>% arrange(Mortality.Rate, Hospital.Name) 

答案 2 :(得分:2)

您可以在dplyr中执行此操作。首先,一些样本数据:

library("dplyr")
hospital_name <- sample(c("hospital_1", "hospital_2", "hospital_3"), 10,
                        replace = TRUE)
state <- sample(letters[1:3], 10, replace = TRUE)
mortality_rate <- runif(10)

df <- data_frame(hospital_name, state, mortality_rate)

按州分组,然后按列排列。

df %>% 
  group_by(state) %>% 
  arrange(mortality_rate, hospital_name)

生成这样的结果,其中状态被分组并且死亡率在每个州内被分类。

## Source: local data frame [10 x 3]
## Groups: state
## 
##    hospital_name state mortality_rate
## 1     hospital_1     b     0.15293591
## 2     hospital_1     b     0.37417167
## 3     hospital_1     b     0.54561856
## 4     hospital_3     c     0.02487033
## 5     hospital_1     c     0.09937557
## 6     hospital_1     c     0.35666087
## 7     hospital_3     c     0.39663460
## 8     hospital_2     c     0.53064144
## 9     hospital_3     c     0.76015632
## 10    hospital_3     c     0.76801890

如果没有group_by(),您只能将死亡率从最低到最高:

df %>%
  arrange(mortality_rate)

## Source: local data frame [10 x 3]
## 
##    hospital_name state mortality_rate
## 1     hospital_3     c     0.02487033
## 2     hospital_1     c     0.09937557
## 3     hospital_1     b     0.15293591
## 4     hospital_1     c     0.35666087
## 5     hospital_1     b     0.37417167
## 6     hospital_3     c     0.39663460
## 7     hospital_2     c     0.53064144
## 8     hospital_1     b     0.54561856
## 9     hospital_3     c     0.76015632
## 10    hospital_3     c     0.76801890

答案 3 :(得分:2)

如果我们已经在加载针(对于这个特定的操作)包,这里是一个包(data.table),在通过引用对数据进行排序的意义上是有用的(不需要复制)它以及使用<-setorder函数setkey)的必要性

library(data.table)
setorder(setDT(df), State, Mortality.Rate, Hospital.Name)

尽管如此,您可能会在创建副本时模仿基本R语法并对数据进行排序(但速度提高,因为data.table会调用其forder

setDT(df)[order(State, Mortality.Rate, Hospital.Name)]

答案 4 :(得分:1)

我想到了

 df <- df[with(df, order(State, as.numeric(Mortality.Rate), Hospital.Name)]

查看此帖子How to sort a dataframe by column(s)?