如何在R语言数据框的年度收益列旁添加对应列的排名列
解决方案
你的问题出在mutate(across(...))的用法上——直接对目标列应用rank()会替换原始列,而非新增列。要保留原始数据同时添加排名列,需要用across的.names参数指定新列命名规则,生成新列而非覆盖原列。
修正后的代码
library(dplyr) # 假设cnam_year2是存储年度列名的向量 test <- yearRetsMSA2 %>% mutate(across(all_of(cnam_year2), ~rank(.), .names = "{.col}_Rank"))
代码说明
all_of(cnam_year2):确保正确引用你的列名向量,避免列名解析报错~rank(.):对每一列计算排名(.代表当前处理的列).names = "{.col}_Rank":指定新列名为原列名加_Rank后缀,比如原列1995 Return会生成1995 Return_Rank
运行后,数据框会保留所有原始年度收益列,同时在每一列旁新增对应的排名列。
示例验证
用你提供的样本数据测试:
# 加载样本数据 yearRetsMSA2 <- structure(list(`1995 Return` = c(0.0151000000000001, 0.0463), `1996 Return` = c(0.0361540734902965, 0.050750262830928), `1997 Return` = c(0.036223616657159, 0.049208659268692)), row.names = c("Abilene, TX", "Akron, OH"), class = "data.frame") cnam_year2 <- colnames(yearRetsMSA2) # 执行修正代码 test <- yearRetsMSA2 %>% mutate(across(all_of(cnam_year2), ~rank(.), .names = "{.col}_Rank")) # 查看结果 print(test)
输出会同时包含原始列和排名列:
1995 Return 1996 Return 1997 Return 1995 Return_Rank 1996 Return_Rank 1997 Return_Rank Abilene, TX 0.015100 0.03615407 0.03622362 1 1 1 Akron, OH 0.046300 0.05075026 0.04920866 2 2 2
内容的提问来源于stack exchange,提问作者js80
相关产品推荐
相关产品推荐

