【问题标题】:Replacing each value in a vector with its rank number for a data.frame将向量中的每个值替换为其 data.frame 的秩数
【发布时间】:2016-05-24 18:41:03
【问题描述】:

在这个假设场景中,我对 13 种化学物质进行了 5 次不同的分析,从而为每次分析中的每种化学物质分配了一个分数。我创建了一个如下表:

---- Analysis1 Analysis2 Analysis3 Analysis4 Analysis5 Chem_1 3.524797844 4.477695034 4.524797844 4.524797844 4.096698498 Chem_2 2.827511555 3.827511555 3.248136118 3.827511555 3.234398548 Chem_3 2.682144761 3.474646298 3.017780505 3.682144761 3.236152242 Chem_4 2.134137304 2.596921333 2.95181339 2.649076603 2.472875191 Chem_5 2.367736454 3.027814219 2.743137896 3.271122346 2.796607809 Chem_6 2.293110565 2.917318708 2.724156207 3.293110565 2.530967343 Chem_7 2.475709113 3.105794018 2.708222528 3.475709113 3.088819908 Chem_8 2.013451822 2.259454085 2.683273938 2.723554966 2.400976121 Chem_9 2.345123123 3.050074893 2.682845391 3.291851228 2.700844104 Chem_10 2.327658894 2.848729452 2.580415233 3.327658894 2.881490893 Chem_11 2.411243882 2.98131398 2.554456095 3.411243882 3.109205453 Chem_12 2.340778276 2.576860244 2.549707035 3.340778276 3.236545826 Chem_13 2.394698249 2.90682524 2.542599327 3.394698249 3.12936843

我想创建与每个分析对应的列,其中包含每种化学品的排名位置。例如,Analysis1,Chem_1 下的值为“1”,Chem_2 下的值为“2”,Chem_3 下的值为“4”,Chem_7 下的值为“4”,@987654327 @ 的值为“5”,依此类推。

【问题讨论】:

    标签: r ranking


    【解决方案1】:

    我们可以从dplyr使用dense_rank

    library(dplyr)
    df %>%
         mutate_each(funs(dense_rank(-.))) 
    

    base R,我们可以做

    df[] <- lapply(-df, rank, ties.method="min")
    

    data.table,我们可以使用

    library(data.table)
    setDT(df)[, lapply(-.SD, frank, ties.method="dense")]
    

    为了避免副本与- 相乘,正如@Arun 在 cmets 中提到的那样

    lapply(.SD, frankv, order=-1L, ties.method="dense")
    

    【讨论】:

    • ties.method="min" != 密集排名。在data.table中,有ties.method="dense"
    • 另外,我会这样做:lapply(.SD, frankv, order=-1L, ties.method="dense"),由于-,这将避免复制。
    【解决方案2】:

    您也可以在基础 R 中执行此操作:

    cbind("..." = df[,1], data.frame(do.call(cbind, 
                                             lapply(df[,-1], order, decreasing = T))))
    
           ... Analysis1 Analysis2 Analysis3 Analysis4 Analysis5
    1   Chem_1         1         1         1         1         1
    2   Chem_2         2         2         2         2        12
    3   Chem_3         3         3         3         3         3
    4   Chem_4         7         7         4         7         2
    5   Chem_5        11         9         5        11        13
    6   Chem_6        13         5         6        13        11
    7   Chem_7         5        11         7        12         7
    8   Chem_8         9         6         8        10        10
    9   Chem_9        12        13         9         6         5
    10 Chem_10        10        10        10         9         9
    11 Chem_11         6         4        11         5         6
    12 Chem_12         4        12        12         8         4
    13 Chem_13         8         8        13         4         8
    

    【讨论】:

      【解决方案3】:

      如果我没记错的话,您希望获得表格的按列排名。这是我的解决方案:

      m=data.matrix(df) # converts data frame to matrix, convert your data to matrix accordingly
      apply(m, 2, function(c) rank(c)) # increasingly
      apply(m, 2, function(c) rank(-c)) # decreasingly
      

      但是,我相信您可以借助此问题的答案自行解决 Get rank of matrix entries?

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多