如何基于引用排名将R语言DataFrame转换为指定格式?
问题:R语言DataFrame按排名转换品种名称
现有一个记录各品种引用排名的R语言DataFrame:
variety <- c("variety1","variety2","variety3","variety4","variety5") people1 <- c(1, NA, 3, 2, NA) people2 <- c(4, 3, 2, 1, NA) people3 <- c(3, 2, NA, 4, 1) df <- data.frame(variety, people1, people2, people3); df需创建一个不含第一列的新DataFrame,其余列按排名顺序列出各人员引用的品种,格式如下:
people1 <- c("variety1", "variety3", "variety2",NA,NA) people2 <- c("variety4", "variety3", "variety2", "variety1", NA) people3 <- c("variety3", "variety2", "variety4", "variety1", NA) df2 <- data.frame(people1, people2, people3); df2即各列按原DataFrame中的排名顺序对应品种名称,可移除NA使列长度不同。
解决方案
可以通过遍历目标列,按排名匹配并排序品种名称来实现,以下是具体步骤和代码:
- 提取需要处理的人员列(排除第一列的品种名称列)
- 对每个人员列执行匹配、排序操作,可选择是否补充NA保持列长度一致
保持列长度与原数据一致的代码
# 原始数据 variety <- c("variety1","variety2","variety3","variety4","variety5") people1 <- c(1, NA, 3, 2, NA) people2 <- c(4, 3, 2, 1, NA) people3 <- c(3, 2, NA, 4, 1) df <- data.frame(variety, people1, people2, people3) # 定义处理单列的函数 process_column <- function(col, varieties) { # 匹配非NA排名对应的品种 matched_vars <- varieties[!is.na(col)] # 按排名升序排序品种 sorted_vars <- matched_vars[order(col[!is.na(col)])] # 补充NA至原列长度 c(sorted_vars, rep(NA, length(col) - length(sorted_vars))) } # 批量处理所有人员列 df2 <- data.frame(lapply(df[, -1], process_column, varieties = df$variety)) # 保持列名与原数据一致 colnames(df2) <- colnames(df)[-1] # 查看结果 df2
仅保留非NA排序结果的代码(列长度可不同)
如果不需要补充NA,直接保留有效排序结果,修改处理函数即可:
process_column <- function(col, varieties) { matched_vars <- varieties[!is.na(col)] matched_vars[order(col[!is.na(col)])] } df2 <- data.frame(lapply(df[, -1], process_column, varieties = df$variety))
注:R的data.frame会自动将较短列补充NA以匹配最长列长度,最终输出与示例格式一致。
内容的提问来源于stack exchange,提问作者user236152
相关产品推荐
相关产品推荐

