根据行模式排序行

时间:2016-05-27 11:44:16

标签: r sorting data-manipulation data-cleaning

我想重新排列一个如下所示的数据帧行:

qs=c("q11", "q22", "q2", "q6", "q10")
ans=rep(1,times=length(qs))
df=data.frame(qs,ans)
arrange(df,qs)

 qs ans
1 q10   1
2 q11   1
3  q2   1
4 q22   1
5  q6   1

但是,我希望对行进行排序以查看更合乎逻辑的顺序,例如:

 qs ans
1  q2   1
2  q6   1
3 q10   1
4 q11   1
5 q22   1

有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

使用R base:

df <- df[order(as.integer(gsub("q", "", as.character(df$qs)))), ]

对于您的示例df,这会给出:

   qs ans
3  q2   1
4  q6   1
5 q10   1
1 q11   1
2 q22   1

您可能会注意到重新排序后的rownames不是1,2,3,4,5;你可以这样做:

rownames(df) <- 1:nrow(df)

让它看起来不错:

   qs ans
1  q2   1
2  q6   1
3 q10   1
4 q11   1
5 q22   1

答案 1 :(得分:2)

我们在转换&#39; qs后使用mixedorder中的gtoolscharacter班级

library(gtools)
df1 <- `row.names<-`(df[mixedorder(as.character(df$qs)),], NULL)
df1
#   qs ans
#1  q2   1
#2  q6   1
#3 q10   1
#4 q11   1
#5 q22   1

或者,我们也可以使用base R移除gsub的非数字字符,转换为numericorder行。

df[order(as.numeric(gsub("\\D+", "", df$qs))),]