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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:40:56