【发布时间】:2014-01-23 02:08:32
【问题描述】:
假设我有一个包含 3 列(name、y、sex)的数据框,其中name 是字符,y 是数值,sex 是一个因子。
sex<-c("M","M","F","M","F","M","M","M","F")
x<-c("MARK","TOM","SUSAN","LARRY","EMMA","LEONARD","TIM","MATT","VIOLET")
name<-as.character(x)
y<-rnorm(9,8,1)
score<-data.frame(x,y,sex)
score
name y sex
1 MARK 6.767086 M
2 TOM 7.613928 M
3 SUSAN 7.447405 F
4 LARRY 8.040069 M
5 EMMA 8.306875 F
6 LEONARD 8.697268 M
7 TIM 10.385221 M
8 MATT 7.497702 M
9 VIOLET 10.177969 F
如果我想通过y 订购它,我会使用:
score[order(score$y),]
x y sex
1 MARK 6.767086 M
3 SUSAN 7.447405 F
8 MATT 7.497702 M
2 TOM 7.613928 M
4 LARRY 8.040069 M
5 EMMA 8.306875 F
6 LEONARD 8.697268 M
9 VIOLET 10.177969 F
7 TIM 10.385221 M
到目前为止,一切都很好...名称保持正确的分数但是我如何重新排序以使 M 和 F 级别不混合。我需要订购并同时保持因子水平分开。
最后我想更进一步涉及角色,这个例子没有帮助,但是如果有绑定 y 值并且我必须在因子内再次订购(例如 TIM 和 TOM 得到 8.4 和我必须指定字母顺序)。
我正在考虑按功能,但它创建了一个列表并没有真正帮助。我认为必须有一些类似的功能应用于数据帧并获取数据帧作为返回。
澄清要点:
sep<-split(score,score$sex)
sep$M<-sep$M[order(sep$M[,2]),]
sep$M
x y sex
1 MARK 6.767086 M
8 MATT 7.497702 M
2 TOM 7.613928 M
4 LARRY 8.040069 M
6 LEONARD 8.697268 M
7 TIM 10.385221 M
sep$F<-sep$F[order(sep$F[,2]),]
sep$F
x y sex
3 SUSAN 7.447405 F
5 EMMA 8.306875 F
9 VIOLET 10.177969 F
merged<-rbind(sep$M,sep$F)
merged
x y sex
1 MARK 6.767086 M
8 MATT 7.497702 M
2 TOM 7.613928 M
4 LARRY 8.040069 M
6 LEONARD 8.697268 M
7 TIM 10.385221 M
3 SUSAN 7.447405 F
5 EMMA 8.306875 F
9 VIOLET 10.177969 F
如果我有 2 或 3 个因素,我知道该怎么做。但是,如果我有严重级别的因素,比如 20,我应该写一个for 循环吗?
【问题讨论】:
-
您是否只想按多个变量排序,例如:
score[order(score$y,score$sex,score$x),]? -
@thelatemail,听起来更像
order(score$sex, score$y, score$x),而不是你建议的。 -
@AnandaMahto - 可能 - 你可以像
with(score,score[order(sex, y, x),])那样把它砍掉 -
我应该阅读您的评论@thelate(或者您应该发布答案)。如果您将此作为答案发布,我将删除我的。