【问题标题】:sorting rows according to a row pattern根据行模式对行进行排序
【发布时间】:2016-09-25 17:54:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: r sorting data-manipulation data-cleaning


    【解决方案1】:

    在将“qs”转换为character 类后,我们使用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))),]
    

    【讨论】:

    • 没有冒犯 akrun,但是为什么你使用 `row.names&lt;-` 使代码更难阅读和维护(尤其是对于新手)而不是第二行?
    • @docendodiscimus 因为我注意到另一张海报已经发布了rownames(df) &lt;- ..,如果我使用它就会变得多余。另外,OP 可能会认为我的答案不完整,所以我借此机会这样做并避免可能的抄袭。
    • @akrun 您的回答有帮助,谢谢。与此相关的一个问题是,如果行是这种形式 'qs=c("Q.1a", "Q.1b", "Q.10a", "Q.10b", "Q.10c", " Q.6a", "Q.6b")' 在这种情况下,答案都不起作用。
    • @msh855 也许qs[mixedorder(sub(".*\\.", "", qs))] #[1] "Q.1a" "Q.1b" "Q.6a" "Q.6b" "Q.10a" "Q.10b" "Q.10c"
    • @akrun,无意冒犯,这是一个错误:)。
    【解决方案2】:

    使用 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
    

    【讨论】:

    • 您的回答有帮助,谢谢。正如已经对 akun 评论的那样,与此相关的一个问题是,如果行是这种形式 'qs=c("Q.1a", "Q.1b", "Q.10a", "Q.10b", " Q.10c", "Q.6a", "Q.6b")' 在这种情况下,答案都不起作用。
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多