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

如何解析DataFrame指定列字符串以生成新行和新列?

解析DataFrame字符串列并拆分成行

原始DataFrame结构如下:

df <- structure(list(user = c("A", "B", "C"), 
                     string = c("Text A [111]; Text B [121]; Text C [131]", 
                                "Text A [211]; Text D [212]", "Text D [311, 321]"), 
                     var1 = c(58, 39, 21)), 
                class = "data.frame", row.names = c(NA, -3L))

需求是将string列按分号拆分,每个元素单独成行,同时提取方括号内的数字到新列value,保留其他列数据,最终目标结构如下:

df2 <- data.frame(
     "user" = c("A", "A", "A", "B", "B", "C"),
     "string" = c("Text A", "Text B", "Text C", "Text A", "Text D", "Text D"),
     "value" = c("111", "121", "131", "211", "212", "311, 321"),
     "var1" = c(58, 58, 58, 39, 39, 21)
)

方法一:使用tidyverse工具链

借助tidyr的行拆分功能和stringr的字符串处理能力,代码简洁高效,适合处理大规模数据:

library(tidyverse)

df2 <- df %>%
  # 按分号+空格拆分string列,生成多行
  separate_rows(string, sep = "; ") %>%
  # 提取方括号内内容并清理原string列
  mutate(
    value = str_extract(string, "(?<=\\[).*(?=\\])"),
    string = str_remove(string, "\\s*\\[.*\\]")
  )

# 输出结果
print(df2)

步骤说明

  • separate_rows(string, sep = "; "):将每个分号加空格分隔的文本元素拆分为独立行,自动复制user和var1列的对应值。
  • str_extract(...):通过正则正向断言,精准提取[与]之间的所有内容(包含逗号分隔的多值)。
  • str_remove(...):移除string列中所有方括号及内部内容,保留纯文本部分。

方法二:Base R实现(无依赖)

如果不想加载第三方包,可通过base R函数组合完成需求:

# 拆分字符串并生成原始行索引
split_str <- strsplit(df$string, "; ")
row_idx <- rep(seq_len(nrow(df)), lengths(split_str))

# 构建基础数据框
df2 <- df[row_idx, c("user", "var1"), drop = FALSE]
df2$string <- unlist(split_str)

# 提取value并清理string列
df2$value <- sub(".*\\[(.*)\\].*", "\\1", df2$string)
df2$string <- sub("\\s*\\[.*\\]", "", df2$string)

# 重置行名
rownames(df2) <- NULL

# 输出结果
print(df2)

步骤说明

  • strsplit(...)拆分每个字符串,rep(...)生成对应原始行的索引,实现其他列数据的复制。
  • sub(".*\\[(.*)\\].*", "\\1", ...):用正则捕获组提取括号内的内容。
  • sub("\\s*\\[.*\\]", "", ...):移除string列中的方括号及内部内容。

内容的提问来源于stack exchange,提问作者tlmoore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:50:28