基于键将DataFrame单元格对齐到对应列的实现方案
解决方案
可以用tidyverse工具链实现批量重排,适合处理数千条记录的大数据场景:
代码实现
library(tidyverse) # 原始数据 df <- data.frame(q1= c("1:4", "1:4", "1:6", "1:7"), q2= c("2:2", "2:4", "3:1", "2:1"), q3= c("3:1", "4:1", "4:2", "3:2"), q4= c("4:3", NA, NA, "4:2")) # 批量重排逻辑 result_df <- df %>% rownames_to_column("row_id") %>% pivot_longer(-row_id, names_to = "original_col", values_to = "kv_pair") %>% filter(!is.na(kv_pair)) %>% mutate( key = str_extract(kv_pair, "^\\d+"), target_col = paste0("q", key) ) %>% pivot_wider(id_cols = row_id, names_from = target_col, values_from = kv_pair) %>% arrange(as.integer(row_id)) %>% select(-row_id) %>% select(q1, q2, q3, q4) # 查看结果 print(result_df)
输出结果
q1 q2 q3 q4 1 1:4 2:2 3:1 4:3 2 1:4 2:4 <NA> 4:1 3 1:6 <NA> 3:1 4:2 4 1:7 2:1 3:2 4:2
逻辑说明
- 保留行号:用
rownames_to_column标记原始行位置,确保重排后行顺序不变。 - 转长格式:
pivot_longer把所有单元格转为"行号-原始列-键值对"的长表,方便统一处理。 - 提取键值:用
str_extract拆分键值对,提取冒号前的数字作为匹配目标列的依据。 - 匹配目标列:根据键生成目标列名(如键3对应q3),再用
pivot_wider转回宽格式,自动将对应键的单元格归位。 - 恢复格式:调整行顺序和列顺序,还原成原始数据的结构。
内容的提问来源于stack exchange,提问作者Icewaffle
相关产品推荐
相关产品推荐

