如何对数据框的行进行字母表排序?

4

我正在尝试对c按字母顺序进行排序,如果x[i]== x[i+1]。我使用了order()函数,但它也改变了x列。我想要对整个行进行排序:

 best <- function(state){
 HospitalName<-vector()
 StateName<-vector()
 HeartAttack<-vector()

  k<-1

  outcome<-read.csv("outcome-of-care-measures.csv",colClasses= "character")

 temp<-(outcome[,c(2,7,11,17,23)])

for (i in 1:nrow(temp)){
 if(identical(state,temp[i,2])==TRUE){
    HospitalName[k]<-temp[i,1]
    StateName[k]<-temp[i,2]
    HeartAttack[k]<-as.numeric(temp[i,4])
    k<-k+1
     }}
    frame<-data.frame(cbind(HospitalName,StateName,HeartAttack))


  library(dplyr)
  frame %>%
  group_by(as.numeric(as.character(frame[,3]))) %>%
  arrange(frame[,1])
    }

  Output:
                               HospitalName StateName HeartAttack
 1              FORT DUNCAN MEDICAL CENTER        TX         8.1
 2         TOMBALL REGIONAL MEDICAL CENTER        TX         8.5
 3        CYPRESS FAIRBANKS MEDICAL CENTER        TX         8.7
 4                  DETAR HOSPITAL NAVARRO        TX         8.7
 5                  METHODIST HOSPITAL,THE        TX         8.8
 6         MISSION REGIONAL MEDICAL CENTER        TX         8.8
 7  BAYLOR ALL SAINTS MEDICAL CENTER AT FW        TX         8.9
 8       SCOTT & WHITE HOSPITAL-ROUND ROCK        TX         8.9
 9         THE HEART HOSPITAL BAYLOR PLANO        TX           9
 10    UT SOUTHWESTERN UNIVERSITY HOSPITAL        TX           9
..                                    ...       ...         ...
Variables not shown: as.numeric(as.character(frame[, 3])) (dbl)

输出不包含 HeartAttack 列,我不明白原因是什么?


可以简单地按照以下方式执行:x[order(x$c), , drop = FALSE]。这里,x是您的数据名称,c是您要排名等级的列等。 - user1267127
@Nemo 这只会按列 c 排序。这不是 OP 想要的。 - LyzandeR
@Henrik 你好,Henrik,感谢您的评论。区别在于他的x列没有排序。如果x列是像2,2,3,3,5,2,2这样的东西,那么根据问题和OP的要求,他想要对c列进行排序,首先是2,2,然后是3,3,最后是下一个2,2,在这种情况下,他不想改变x列的顺序(他提到他不想改变x列的顺序,这种情况下我的答案就不正确了)。无论如何,也许我应该先等待OP更多的澄清。 - LyzandeR
@LyzandeR 很难解释整个代码。我可以把整个代码发送给你,但我不确定这是否违反了本论坛的规定。 - EnginO
@EnginO 在你的问题中添加代码并不是被禁止的,相反地,这是被鼓励的。但请尽量准确。只使用展示你问题的代码/数据。如果你包含了300行代码,其中280行是无关紧要的,那么这并没有帮助。试着展示你的数据长什么样子以及为什么下面的答案不能解决你的问题。 - LyzandeR
显示剩余10条评论
1个回答

5

dplyr 的一种解决方案:

library(dplyr)
df %>%
  group_by(x) %>%
  arrange(c)

或者如下面评论中@Akrun所提到的那样。
df %>%
  arrange(x,c)

如果你对分组不感兴趣,那就取决于你想要什么。

Source: local data frame [5 x 2]
Groups: x

  x c
1 2 A
2 2 D
3 3 B
4 3 C
5 5 E

在基本的R中,还有另一种解决方案,但只有在您的x列按原样排序或者您不介意更改它的顺序时才能起作用:

> df[order(df$x, df$c), , drop = FALSE]
  x c
2 2 A
1 2 D
4 3 B
3 3 C
5 5 E

是的,你需要先用 install.packages('dplyr') 安装它,然后用 library(dplyr) 加载它才能使用。 - LyzandeR
这需要一个贡献的软件包,而不是基本的R。 - gd047
@GeorgeDontas 为什么不能使用外部包?问题中没有提到基本的R。这不是投反对票的理由...而且原帖作者并不想要一个简单的列排序。 - LyzandeR
@GeorgeDontas 原帖想要根据列x对列c进行排序,即分组排序。我不明白为什么我不能使用dplyr。你能解释一下吗? - LyzandeR
我也认为我的问题不是重复的,因为我只想在数据框中的数字相等时按字母顺序排序。仍在寻找答案。 - EnginO
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接