根据同一数据框中不同列的最大值/最小排序值对数据帧中的列进行筛选
我有一个数据框,如下所示。它只是一个例子。真实的数据集要大得多。根据同一数据框中不同列的最大值/最小排序值对数据帧中的列进行筛选
Hospital State Mortality Rank
aaa AK 9.7 1
bbb AK 10.5 2
ccc AK 11.3 3
ddd AK 11.5 4
eee AL 8.7 1
ggg AL 9.1 2
hhh AL 9.3 3
mmm AR 9.9 1
nnn AR 10.2 2
ooo AR 10.4 3
ppp AZ 7.5 1
qqq AZ 8.7 2
为了可重复使用的目的获取上述数据帧的代码如下。
df <- data.frame(Hospital=c("aaa","bbb","ccc","ddd","eee","ggg","hhh","mmm","nnn","ooo","ppp","qqq"),State=c("AK","AK","AK","AK","AL","AL","AL","AR","AR","AR","AZ","AZ"), Mortality=c(9.7,10.5,11.3,11.5,8.7,9.1,9.3,9.9,10.2,10.4,7.5,8.7),Rank=c(1,2,3,4,1,2,3,1,2,3,1,2))
当我通过所谓最坏的说法,我想从具有最低排名数据帧抽取医院和状态栏。
预期的输出应该是这样的
Hospital State
ddd AK
hhh AL
ooo AR
qqq AZ
即使我能得到如下结果一个,我可以使用dplyer的选择功能,并得到上述预期的结果。
Hospital State Mortality Rank
ddd AK 11.5 4
hhh AL 9.3 3
ooo AR 10.4 3
qqq AZ 8.7 2
我利用下面的代码来得到每个组中排名最低的值的列表。对象最差1列出了每个组的最低排名值。
worst<-df %>% group_by(State) %>% summarise(max = max(Rank))
worst1 <- as.vector(worst[,2, drop=FALSE])
想知道如果我可以使用它来提取我的期望输出或是否有更简单的方法,直接获得所需的输出。
我试过使用这个df[df$Rank %in% worst1,]
但我dint得到任何结果。任何形式的帮助都会非常有用。在此先感谢
一种选择是在summarise()
改变变量的名称,然后inner_join()
df
和worst
。
worst <- df %>%
group_by(State) %>%
summarise(Rank = max(Rank))
worst1 <- inner_join(df, worst, by = c("State", "Rank"))
这是一个更简短的解决方案,无需创建单独的数据框。只需使用dplyr :: top_n
df %>% group_by(State) %>% top_n(1, Rank)
感谢@NiclasRudolfson这个不错的技巧,我不知道'top_n'函数。 @ Sai Ram,同样,'df%>%group_by(州)%>%top_n(-1,Rank)'会给你每个州的最低排名医院。 – ANG
top_n()将选择每个组中排名最高的行,所以会给你“最差”的医院。如果你想得到最好的结果,我会建议'top_n(1,desc(Rank)'而不是'top_n(-1,Rank)' – NiclasRudolfson
非常感谢你的帮助 –
非常感谢。它的工作就像我想要的 –