【问题标题】:Multilevel ordering with dplyr使用 dplyr 进行多级排序
【发布时间】:2015-04-28 09:02:57
【问题描述】:

我有以下数据框:

tdf <- structure(list(GO = c("Cytokine-cytokine receptor interaction", 
"Cytokine-cytokine receptor interaction|Endocytosis", "I-kappaB kinase/NF-kappaB signaling", 
"NF-kappa B signaling pathway", "NF-kappaB import into nucleus", 
"T cell chemotaxis"), PosCount = c(17, 18, 4, 5, 1, 2), shortgo = structure(c(1L, 
1L, 2L, 2L, 2L, 3L), .Label = c("z", "X", "y"), class = "factor")), .Names = c("GO", 
"PosCount", "shortgo"), row.names = c(NA, 6L), class = "data.frame")

看起来像这样:

                                                  GO PosCount shortgo
1             Cytokine-cytokine receptor interaction       17       z
2 Cytokine-cytokine receptor interaction|Endocytosis       18       z
3                I-kappaB kinase/NF-kappaB signaling        4       X
4                       NF-kappa B signaling pathway        5       X
5                      NF-kappaB import into nucleus        1       X
6                                  T cell chemotaxis        2       y

然后我想做的是首先按字母顺序按shortgo 排序-不区分大小写-然后为每个shortgo 组在内部按PosCount 排序。产生这个:

                                                  GO PosCount shortgo
                       NF-kappa B signaling pathway        5       X
                I-kappaB kinase/NF-kappaB signaling        4       X
                      NF-kappaB import into nucleus        1       X
                                  T cell chemotaxis        2       y
 Cytokine-cytokine receptor interaction|Endocytosis       18       z
             Cytokine-cytokine receptor interaction       17       z

但是为什么这不起作用:

library(dplyr)
tdf[order(tdf$shortgo),]
tdf <- tdf %>% group_by(shortgo) %>% arrange(desc(PosCount))

正确的做法是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您只需将它们组合成一个调用。虽然您需要先将 shortgo 转换为 character 类(请参阅下面的说明)

    tdf %>% 
        arrange(as.character(shortgo), desc(PosCount))
    #                                                   GO PosCount shortgo
    # 1                       NF-kappa B signaling pathway        5       x
    # 2                I-kappaB kinase/NF-kappaB signaling        4       x
    # 3                      NF-kappaB import into nucleus        1       x
    # 4                                  T cell chemotaxis        2       y
    # 5 Cytokine-cytokine receptor interaction|Endocytosis       18       z
    # 6             Cytokine-cytokine receptor interaction       17       z
    

    所以您需要转换为字符的原因是因为shortgo 是一个因子,它基本上是一个带有levels 属性的integer 向量。所以order 使用这些整数来排序你的向量。在您的情况下,整数与级别的正确顺序不对应

    tdf$shortgo
    ## [1] z z x x x y
    ## Levels: z x y
    as.numeric(tdf$shortgo)
    ## [1] 1 1 2 2 2 3
    

    所以你可以看到z 编码为 1,x 编码为 2,y 编码为 3,而它应该是 3、2、1。因此sort 返回“错误”结果

    sort(tdf$shortgo)
    # 1] z z x x x y
    # Levels: z x y
    

    比较

    test <- factor(sort(as.character(tdf$shortgo)))
    sort(test)
    ## [1] x x x y z z
    ## Levels: x y z
    

    【讨论】:

      【解决方案2】:

      你可以使用order base R:

      with(tdf, tdf[order(tolower(shortgo), -PosCount),])
      
      #                                                  GO PosCount shortgo
      #4                       NF-kappa B signaling pathway        5       X
      #3                I-kappaB kinase/NF-kappaB signaling        4       X
      #5                      NF-kappaB import into nucleus        1       X
      #6                                  T cell chemotaxis        2       y
      #2 Cytokine-cytokine receptor interaction|Endocytosis       18       z
      #1             Cytokine-cytokine receptor interaction       17       z
      

      【讨论】:

      • 这里只是一个注释,tolower 除了将factor 转换为character 之外没有任何作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多