r - 使用 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
:一个分数告诉我整个数据集中某个基因在给定行上的表现优于该基因的比例。
任何帮助将非常感激!如果我需要澄清任何事情或添加更多信息,请告诉我!
解决方案
有点类似于马丁斯的回答,但使用的是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 创建
推荐阅读
- gitlab - 我超过了 10GB 免费套餐,所以我删除了一些文件,但它不会让我推送更改
- c - 返回意外值的基本程序
- c# - 如何在 C# 中从 char 数据类型更改为字符串?
- ruby-on-rails - 在 Rails 应用程序中,我如何实现 IdentityServer4 客户端(混合流)并进行用户身份验证并拥有 ecured API
- azure-cosmosdb - CosmosDB 选项“生产”与“非生产”的真正作用是什么?
- c++ - 在表单内部调用循环
- c# - 如何在 ASP.NET Core 中获取多个复选框值
- git - Solaris 中 Git 和“GNU 交互工具”之间的冲突
- eclipse - Ecore - 有没有办法从另一个 ecore 元模型中引用一个 ecore 元模型?
- r - 重新排列矩阵的列,每行采用不同的顺序