根据行模式对行进行排序

sorting rows according to a row pattern

我想重新排列数据框的行,如下所示:

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

有人可以帮我解决这个问题吗?

在将 'qs' 转换为 character class

后,我们使用 gtools 中的 mixedorder
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))),]

使用 R 基础:

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

您可能会注意到,重新排序后行名不是 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