在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_1 | option_2 | option_3 | option_4 |
|---|---|---|---|
| 4 | 2 | 1 | 3 |
| 4 | 2 | 1 | 3 |
| 1 | 4 | 2 | 3 |
内容的提问来源于stack exchange,提问作者Giacomo Oliva
相关产品推荐
相关产品推荐

