首页 > 解决方案 > 使用 mutate 和 min_rank 根据其他两列中的值创建排名列

问题描述

我正在尝试重新访问一些较旧的代码,其中我使用了一个 for 循环来计算基于两列的基因的组合排名。我的最终目标是列出一个列,列出数据集中任何给定基因表现优于的基因比例。

我有一个我称之为分数的data.frame,其中包含两列与我的基因相关的分数。为了计算组合排名,我使用以下 for 循环,并通过将结果排名除以观察总数来计算比例分数。

scores <- data.frame(x = c(0.128, 0.279, 0.501, 0.755, 0.613), y = c(1.49, 1.43, 0.744, 0.647, 0.380))

#Calculate ranking
comb.score = matrix(0, nrow = nrow(scores), ncol = 1)
for(i in 1:nrow(scores)){
  comb.score[i] = length(which(scores[ , 1] < scores[i, 1] & scores[ , 2] < scores[i, 2]))
}

comb.score <- comb.score/length(comb.score) #Calculate proportion 

现在我已经对 tidyverse 变得更加熟悉和舒适,我想将此代码转换为使用 tidyverse 函数,但我自己无法弄清楚,也无法通过 SO 或 RStudio 社区的答案。

我想到的想法是一起使用mutate()min_rank()但我不完全确定语法。此外,min_rank()似乎使用逻辑测试来评估排名的行为,scores[ , 1] <= scores[i, 1]而不是像我在原始测试中所做的那样仅使用 <。

我预期的结果是表格中的一个附加列,它与上述代码中的输出scores具有相同的输出comb.score:一个分数告诉我整个数据集中某个基因在给定行上的表现优于该基因的比例。

任何帮助将非常感激!如果我需要澄清任何事情或添加更多信息,请告诉我!

标签: rdplyr

解决方案


有点类似于马丁斯的回答,但使用的是pmap

library(tidyverse)

scores <- data.frame(
    x = c(0.128, 0.279, 0.501, 0.755, 0.613), 
    y = c(1.49, 1.43, 0.744, 0.647, 0.380)
)

scores %>% 
  mutate(
    score = pmap(list(x, y), ~ sum(..1 > x & ..2 > y)) / n()
  )
#>       x     y score
#> 1 0.128 1.490     0
#> 2 0.279 1.430     0
#> 3 0.501 0.744     0
#> 4 0.755 0.647   0.2
#> 5 0.613 0.380     0

reprex 包(v0.3.0)于 2020-06-18 创建


推荐阅读