在R中拆分多值字段并重复关联字段完成数据重组
R 实现多值行拆分对齐方案
方法1:tidyverse 套件实现(代码更简洁)
适合已经安装tidyverse的场景,自动保证顺序匹配:
library(tidyverse) # 你已提取的三个列表示例,替换为你自己的变量即可 house_type <- c("House", "Flat", "Mobile Home", "Camper-Van") name_col <- c("Name1", "Name2;Name3", "Name4", "Name5;Name6;Name7;Name8") email_col <- c("Email1@xyz.com", "Email2@xyz.com;Email3@xyz.com", "Email4@xyz.com", "Email5@xyz.com;Email6@xyz.com;Email7@xyz.com;Email8@xyz.com") # 组装为原始数据框 raw_df <- tibble(house_type, name = name_col, email = email_col) # 按分号拆分多值列,自动扩展行、重复住房类型 result_df <- raw_df %>% separate_longer_delim(c(name, email), delim = ";")
方法2:基础R实现(无需安装额外包)
# 你已提取的三个列表示例,替换为你自己的变量即可 house_type <- c("House", "Flat", "Mobile Home", "Camper-Van") name_col <- c("Name1", "Name2;Name3", "Name4", "Name5;Name6;Name7;Name8") email_col <- c("Email1@xyz.com", "Email2@xyz.com;Email3@xyz.com", "Email4@xyz.com", "Email5@xyz.com;Email6@xyz.com;Email7@xyz.com;Email8@xyz.com") # 计算每行需要重复的次数 row_rep_times <- lengths(strsplit(name_col, ";")) # 重复住房类型向量到匹配长度 rep_house <- rep(house_type, times = row_rep_times) # 拆分姓名、邮箱为长向量 split_names <- unlist(strsplit(name_col, ";")) split_emails <- unlist(strsplit(email_col, ";")) # 合并为最终数据框 result_df <- data.frame( house_type = rep_house, name = split_names, email = split_emails )
补充说明
- 两种方法均严格保留原行内姓名和邮箱的分号分隔顺序,不会出现匹配错乱
- 如需导出为目标格式csv,可执行代码:
write.csv(result_df, "输出文件路径.csv", row.names = FALSE, quote = FALSE)
内容的提问来源于stack exchange,提问作者Hans Peter
相关产品推荐
相关产品推荐

