如何用向量值高效填充R语言中的排名数据框?
高效替换排名数据框为对应数值的方法
原始数据与需求
你有一个存储排名的数据框:
Rank.Df = data.frame(A1 = c(1, NA, NA), A2 = c(2, 1, NA), A3 = c(2, 1 , 3)); Rank.Df
以及对应排名的数值向量:
Values = c(50,40,30) #50对应排名1,40对应排名2,30对应排名3
需要将数据框中的排名值替换为Values中对应的数值,同时保留NA,且替代低效的嵌套循环实现。
高效实现方法
1. 基础R向量化操作(最快最简洁)
利用R的向量化索引特性,直接对整个数据框进行操作——底层由C实现,远快于纯R循环:
Df.results <- as.data.frame(Values[Rank.Df])
原理:数据框本质是列向量的列表,Values[Rank.Df]会自动对数据框的每个元素进行索引匹配,NA值会被保留,最后转成数据框即可。
2. tidyverse/dplyr风格实现
如果习惯使用tidyverse生态,可以用across()函数批量处理所有列:
library(dplyr) Df.results <- Rank.Df %>% mutate(across(everything(), ~ Values[.]))
结果验证
两种方法得到的结果与你原来的嵌套循环完全一致:
A1 A2 A3 1 50 40 40 2 NA 50 50 3 NA NA 30
内容的提问来源于stack exchange,提问作者Vinicius B. de S. Moreira
相关产品推荐
相关产品推荐

