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

在R语言中重塑选项偏好排名的DataFrame

合适的问题标题建议
  • R语言:将顺位-选项映射的DataFrame重塑为选项-顺位值结构
  • 如何在R中转换投票排名数据的列结构(从顺位列到选项列)
实现方法

首先构造你提供的初始DataFrame:

df <- data.frame(
  first = c(3, 3, 1),
  second = c(2, 2, 3),
  third = c(4, 4, 4),
  fourth = c(1, 1, 2)
)

方法一:Base R 原生实现

核心逻辑是为每行建立「选项→对应顺位数字」的映射,再按选项1-4的顺序整理结果:

# 逐行处理数据,生成选项到顺位数字的映射
result_base <- t(apply(df, 1, function(row) {
  # 匹配顺位列名对应的数字(first=1、second=2...),并以选项为命名
  option_rank_map <- setNames(
    match(names(df), c("first", "second", "third", "fourth")),
    row
  )
  # 按选项1-4的顺序排序输出
  option_rank_map[order(names(option_rank_map))]
}))

# 设置目标列名并转换为DataFrame
colnames(result_base) <- paste0("option_", 1:4)
result_base <- as.data.frame(result_base)

方法二:Tidyverse 工具链实现(dplyr + tidyr)

通过「宽转长→转换顺位为数字→长转宽」的流程完成重塑,代码可读性更强:

library(dplyr)
library(tidyr)

result_tidy <- df %>%
  # 添加行号,用于识别每条投票记录
  mutate(row_id = row_number()) %>%
  # 转换为长格式,拆分出顺位名称和对应选项
  pivot_longer(cols = -row_id, names_to = "rank", values_to = "option") %>%
  # 将文字顺位转换为数字(first→1、second→2等)
  mutate(rank_num = match(rank, c("first", "second", "third", "fourth"))) %>%
  # 按行号和选项排序,保证宽格式的列顺序正确
  arrange(row_id, option) %>%
  # 转换为目标宽格式,设置列名前缀
  pivot_wider(
    id_cols = row_id,
    names_from = option,
    values_from = rank_num,
    names_prefix = "option_"
  ) %>%
  # 移除临时行号列
  select(-row_id)

两种方法最终都会得到选项为列、顺位数字为值的目标DataFrame,示例输出如下:

option_1option_2option_3option_4
4213
4213
1423

内容的提问来源于stack exchange,提问作者Giacomo Oliva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:05:30