You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于引用排名将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使列长度不同。

解决方案

可以通过遍历目标列,按排名匹配并排序品种名称来实现,以下是具体步骤和代码:

  1. 提取需要处理的人员列(排除第一列的品种名称列)
  2. 对每个人员列执行匹配、排序操作,可选择是否补充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:00:58