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

如何高效拆分字符串列,避免使用rowwise处理大数据框?

嘿,我懂你纠结的点——用rowwise()处理大数据框的时候确实慢得让人着急,咱们换用向量化的字符串操作就能解决这个问题,效率能提升一大截!下面给你几个不用rowwise()的高效方案:

高效拆分字符串列的实现方法

你的需求是把size列里类似(x, y)格式的字符串,拆成lower和upper两个数值列,以下几种方法都是批量处理整个列,完全不用逐行操作:

方法1:用tidyr::separate()一步搞定(最简洁)

separate()是专门用来拆分列的向量化函数,处理大数据的性能非常出色:

library(dplyr)
library(tidyr)
library(stringr)

# 你的原始数据
a <- "(1, 10)"
b <- "(10, 20)"
c <- "(20, 30)"
df <- data.frame(size = c(a,b,c))

# 拆分并自动转数值型
df_clean <- df %>%
  # 先批量去掉所有括号
  mutate(size = str_remove_all(size, "[()]")) %>%
  # 拆分列,同时自动转换为数值
  separate(size, into = c("lower", "upper"), sep = ", ", convert = TRUE)

print(df_clean)

运行后会得到预期结果:

lower upper
1     1    10
2    10    20
3    20    30

方法2:用stringr灵活提取数字

如果需要更灵活的提取逻辑(比如字符串格式有小变动时),用str_extract_all()结合unnest_wider()也很高效:

library(dplyr)
library(stringr)
library(tidyr)

df_clean <- df %>%
  # 批量提取每个字符串里的所有数字,返回列表列
  mutate(nums = str_extract_all(size, "\\d+")) %>%
  # 把列表列展开成两列
  unnest_wider(nums, names_sep = "") %>%
  # 重命名列
  rename(lower = nums1, upper = nums2) %>%
  # 转换为数值型
  mutate(across(c(lower, upper), as.numeric)) %>%
  # 去掉中间的列表列
  select(-nums)

print(df_clean)

方法3:Base R 原生方案(无需加载包)

要是不想依赖tidyverse包,用Base R的原生函数也能实现高效处理:

# 原始数据
a <- "(1, 10)"
b <- "(10, 20)"
c <- "(20, 30)"
df <- data.frame(size = c(a,b,c))

# 1. 批量去掉括号
df$size_clean <- gsub("[()]", "", df$size)
# 2. 拆分所有行的字符串
split_result <- strsplit(df$size_clean, ", ")
# 3. 把拆分结果转成数据框并合并
df_clean <- cbind(df, do.call(rbind, split_result))
# 4. 重命名列并转数值型
names(df_clean)[c(2,3)] <- c("lower", "upper")
df_clean$lower <- as.numeric(df_clean$lower)
df_clean$upper <- as.numeric(df_clean$upper)
# 5. 清理临时列
df_clean <- df_clean[, -2]

print(df_clean)

为什么这些方法比rowwise()高效?

rowwise()会强制dplyr逐行遍历处理数据,相当于隐形的循环;而上面的所有方法都是向量化操作——它们一次性处理整个列的所有数据,完全没有逐行循环的开销,数据量越大,性能优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:19