如何批量拆分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
相关产品推荐
相关产品推荐

