如何拆分R数据框中含换行符的单元格生成新列?
拆分R数据框中含换行符的单元格为两列
原始数据复现
首先加载示例数据框:
df <- structure(list( `Frequency\nPercent` = c("car", "window", "ball", "ups"), AI = c("2\n0.00", "3\n0.00", "1\n0.00", "2\n0.00"), BLK = c("0\n0.00", "218\n0.29", "48\n0.06", "0\n0.00"), HIANIC = c("1\n0.00", "8\n0.01", "4\n0.01", "0\n0.00"), NATRICAN = c("9\n0.01", "7\n0.01", "8\n0.01", "0\n0.00"), UNK = c("15\n0.02", "83\n0.11", "36\n0.05", "0\n0.00"), yy = c("111\n0.15", "897\n1.20", "756\n1.02", "1\n0.00") ), class = "data.frame", row.names = c(NA, -4L))
方法一:使用tidyverse工具链批量处理
借助dplyr和tidyr的批量处理能力,高效拆分所有目标列:
library(tidyverse) # 拆分并命名新列,同时转换数据类型 df_processed <- df %>% mutate( across( -`Frequency\nPercent`, ~ str_split_fixed(., "\n", 2) %>% as_tibble(.name_repair = ~ paste0(cur_column(), c("_freq", "_percent"))) %>% # 将频率转为整数,百分比转为数值 mutate( across(ends_with("_freq"), as.integer), across(ends_with("_percent"), as.numeric) ) ) ) %>% unnest(cols = -`Frequency\nPercent`)
方法二:Base R 原生实现
无需额外安装包,用Base R函数完成拆分:
# 筛选需要拆分的列(排除第一列) split_cols <- setdiff(names(df), "Frequency\nPercent") # 遍历拆分每个列 split_list <- lapply(split_cols, function(col) { split_data <- str_split_fixed(df[[col]], "\n", 2) colnames(split_data) <- paste0(col, c("_freq", "_percent")) # 转换数据类型 split_data[, 1] <- as.integer(split_data[, 1]) split_data[, 2] <- as.numeric(split_data[, 2]) as.data.frame(split_data) }) # 合并结果 df_processed_base <- cbind(df[, "Frequency\nPercent", drop = FALSE], do.call(cbind, split_list))
两种方法最终都会生成包含原始分类列(Frequency\nPercent)和所有拆分后的频率、百分比列的数据框,例如AI列会拆分为AI_freq(整数类型)和AI_percent(数值类型)。
内容的提问来源于stack exchange,提问作者Ali Roghani
相关产品推荐
相关产品推荐

