我有一个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(),还是有其他方法?
答案 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
函数
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)]