根据行模式对行进行排序
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
的非数字字符,转换为 numeric
,order
行。
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
我想重新排列数据框的行,如下所示:
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
的非数字字符,转换为 numeric
,order
行。
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