【问题标题】:R: ordering rows in reshape2R:在 reshape2 中排序行
【发布时间】:2023-09-26 01:27:01
【问题描述】:

我有一种情况需要使用 R 中的 reshape2融化数据。

melt(head(faithful), measure.vars = names(faithful))

这给出了输出:

    variable  value
1  eruptions  3.600
2  eruptions  1.800
...
7    waiting 79.000
8    waiting 54.000
...

我想根据数据框中的列对输出进行排序,使其具有前几行。例如:

    variable  value
1  eruptions  3.600
2    waiting 79.000
3  eruptions  1.800
4    waiting 54.000
...

我怎样才能通过避免循环来实现这一点。

【问题讨论】:

    标签: r reshape2 melt


    【解决方案1】:

    我会使用一个额外的列tag

    df<-faithful
    df<-cbind(df,tag=1:nrow(faithful))
    df2<-melt(df,id.vars = "tag")
    df2<-df2[order(df2$tag),]
    df2$tag<-NULL#drop it like it's hot
    head(df2)
    

    尔格:

         variable  value
    1   eruptions  3.600
    273   waiting 79.000
    2   eruptions  1.800
    274   waiting 54.000
    3   eruptions  3.333
    275   waiting 74.000
    

    【讨论】:

    • 我想说 OP 应该保留标签。如果他们这么关心排序,他们至少应该保留一些这样做的方法,嗯。
    • 试图模仿 OP 的输出 :) 这就是 'drop' 的原因。
    【解决方案2】:

    我知道有人要求reshape2 解决方案,但另一个好方法是使用tidyverse

    library(tidyverse)
    head(faithful) %>% mutate(tag = 1:n()) %>% gather(var, val, -tag) %>% arrange(tag)
    
       tag       var    val
    1    1 eruptions  3.600
    2    1   waiting 79.000
    3    2 eruptions  1.800
    4    2   waiting 54.000
    # etc
    

    不需要中间对象。

    【讨论】: