如何解析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
相关产品推荐
相关产品推荐

