How to order columns by groups in R

I have a data.frame (say "df") looks like this:

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

(The Hospital.Name is unique)

Now I want to order the group "Mortality.Rate" by "State", i.e. order a bid in a certain condition. If there is a connection in speed, then "Hospital.Name" is used to resolve the tie.

The functions "order ()" and "tapply ()" came to my mind. I am encoded as follows:

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

However, an "argument length" error occurs. When the order function is applied to the sliced ​​Rate, the second order argument (for example, df $ Hospital.Name) is not sliced.

How can I pass the second argument (to resolve the binding in order) to tapply () or are there any other approaches?

+4
5

R order(), , :

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

dplyr:

df %>% group_by(State) %>% arrange(Mortality.Rate, Hospital.Name) 
+3

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
+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)]
+2

.

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

()?

+1

All Articles