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

如何批量拆分R语言数据框中多列的键值对?

批量拆分DataFrame多列的解决方案

需求场景

现有如下格式的DataFrame,每列内容均为key:value结构,需要批量按冒号拆分所有列,自动生成新列(无需手动指定列名):

df <- data.frame(V_1 = c("name:B", "name:c", "name:d", "name:a", "name:k","name:A"),
                 V_2 = c("name:X", "name:Y", "name:Z", "name:K", "name:L","name:K"))

期望输出:

df2 <- data.frame(C_1 = c("name", "name", "name", "name", "name","name"),
                  C_2 = c("B", "c", "d", "a", "k","A"),
                  C_3 = c("name", "name", "name", "name", "name","name"),
                  C_4 = c("X", "Y", "Z", "K", "L","K"))
df2

解决方案

方法1:Tidyverse 简洁实现(推荐)

使用tidyr的separate_wider_delim函数,配合批量处理能力,快速完成所有列的拆分:

library(tidyr)
library(dplyr)

df2 <- df %>%
  separate_wider_delim(everything(), delim = ":") %>%
  rename_with(~paste0("C_", seq_along(.)), everything())
  • everything():指定处理DataFrame的所有列
  • delim = ":":按冒号拆分每一列
  • rename_with(...):将拆分后的列统一重命名为C_1、C_2...序列

如果需要限制拆分次数(比如仅拆分第一个冒号),可以用str_split_fixed结合unnest_wider:

df2 <- df %>%
  mutate(across(all_of(colnames(df)), ~str_split_fixed(., ":", 2))) %>%
  unnest_wider(everything()) %>%
  rename_with(~paste0("C_", seq_along(.)), everything())

方法2:Base R 原生实现

无需依赖第三方包,用原生函数完成批量拆分:

# 逐列拆分并转换为矩阵格式
split_list <- lapply(df, function(col) do.call(rbind, strsplit(col, ":")))
# 合并所有拆分后的列
df2 <- as.data.frame(do.call(cbind, split_list))
# 统一重命名列
colnames(df2) <- paste0("C_", seq_len(ncol(df2)))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:52:55