我想重新排列一个如下所示的数据帧行:
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
有人可以帮我吗?
答案 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
中的gtools
到character
班级
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))),]