如何在R中通过循环遍历变量与data frame优化数据整理
高效提取长字符串中人员信息并整理为Data Frame的R方案
问题背景
现有包含多个人名、性别等信息的长字符串数据,需从中提取指定信息并整理为结构化Data Frame。原实现方案通过重复复制Data Frame的方式完成,代码冗余且扩展性差,现提供两种高效实现方案。
示例数据
df <- data.frame(Movie=c("Matrix", "Black Widow"), People=c("¤¤¤34543¤Keanu Reeves¤932 9273¤Male¤¤¤02734¤Laurence Fishburne¤936 2740¤Male¤¤¤47622¤Carrie-Anne Moss¤938 0722¤Female¤¤¤21539¤Hugo Weaving¤953 6124¤Male", "¤¤¤98237¤Scarlett Johansson¤923 8734¤Female¤¤¤72367¤Florence Pugh¤732 4284¤Female¤¤¤55661¤David Harbour¤981 2469¤Male"))
目标Data Frame
# Movie Name Sex #1 Matrix Keanu Reeves Male #2 Black Widow Scarlett Johansson Female #3 Matrix Laurence Fishburne Male #4 Black Widow Florence Pugh Female #5 Matrix Carrie-Anne Moss Female #6 Black Widow David Harbour Male #7 Matrix Hugo Weaving Male
方案一:使用Tidyverse工具链(推荐)
利用tidyr和stringr的函数链式操作,无需手动计算列数,代码简洁易维护,处理大数据量效率更高。
library(tidyverse) final_df <- df %>% # 按"¤¤¤"分割People列,将每个人员的信息拆分为单独一行 separate_rows(People, sep = "¤¤¤") %>% # 过滤分割后产生的空行 filter(People != "") %>% # 提取姓名(第二个¤后、数字前的内容)和性别(最后一个¤后的内容) mutate( Name = str_extract(People, "(?<=¤)[^¤]+(?=¤\\d)"), Sex = str_extract(People, "(?<=¤)[^¤]+$") ) %>% # 保留需要的列 select(Movie, Name, Sex) %>% # 移除姓名为空的无效行 filter(Name != "")
方案二:基础R循环实现(兼容旧环境)
通过列表存储循环生成的临时Data Frame,避免手动创建多个df1/df2变量,解决原方案中循环无法有效生成Data Frame名称的问题。
library(stringr) # 先将People列按¤分割为多列 df$people_count <- str_count(df$People, "¤") max_people_count <- max(df$people_count) new_varnames <- paste0("Name", 0:max_people_count) df[new_varnames] <- str_split_fixed(df$People, "¤", max_people_count + 1) # 创建空列表存储每个人员的Data Frame df_list <- list() # 循环提取每组人员的姓名和性别(每组间隔6列) # 循环次数根据数据中最多的人员数量调整,示例中最多4人,所以循环4次 for (i in seq(0, 3)) { # 计算当前组的列索引:Movie列 + 姓名列 + 性别列 col_idx <- c(1, 8 + 6*i, 10 + 6*i) temp_df <- df[, col_idx] colnames(temp_df) <- c("Movie", "Name", "Sex") df_list[[i+1]] <- temp_df } # 合并所有临时Data Frame并过滤空行 final_df <- do.call(rbind, df_list) final_df <- final_df[final_df$Name != "", ]
方案优势对比
- 原冗余方案:需手动复制多份Data Frame代码,人员数量增加时需重复修改代码,扩展性极差。
- 上述两种方案:无需手动调整列索引或复制代码,可自适应处理更多人员的情况,代码结构清晰,维护成本低。
内容的提问来源于stack exchange,提问作者Struggle on
相关产品推荐
相关产品推荐

