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

如何拆分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:55:15