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

如何在R中将含数字与描述的单列拆分为多列(值为数字,列名为描述)

在R中实现文本列到多数值列的转换

首先构造原始数据框:

library(tidyverse)

# 原始数据框
df <- tibble(
  text = c(
    "2,413 European ancestry cases, 2,392 European ancestry controls, 810 African American",
    "2,731 European ancestry cases, 10,747 European ancestry controls",
    "8,918 European ancestry individuals, 3,947 Indian Asian ancestry individuals",
    "175 Han Chinese ancestry cases, 175 Han Chinese ancestry controls"
  )
)

推荐方法(tidyverse工具链)

通过拆分文本、提取关键信息、转换宽格式三步实现需求,代码简洁易读:

result <- df %>%
  # 按逗号拆分每行内容为独立条目,同时清理多余空格
  separate_rows(text, sep = ",\\s*") %>%
  # 用正则提取数字段和对应的描述标签
  extract(
    text,
    into = c("value", "label"),
    regex = "^([0-9,]+)\\s+(.*)$",
    remove = FALSE
  ) %>%
  # 去掉数字中的逗号并转为数值类型
  mutate(value = as.numeric(str_remove_all(value, ","))) %>%
  # 转换为宽格式,缺失值自动填充NA
  pivot_wider(
    names_from = label,
    values_from = value,
    values_fill = NA_real_
  ) %>%
  # 移除原始文本列(可选操作)
  select(-text)

# 查看最终结果
print(result)

运行后输出结果与需求完全匹配:

# A tibble: 4 × 7
  `European ancestry cases` `European ancestry controls` `African American` `European ancestry individuals` `Indian Asian ancestry individuals` `Han Chinese ancestry cases` `Han Chinese ancestry controls`
                      <dbl>                        <dbl>              <dbl>                           <dbl>                              <dbl>                        <dbl>                          <dbl>
1                      2413                         2392                810                              NA                                 NA                           NA                              NA
2                      2731                        10747                 NA                              NA                                 NA                           NA                              NA
3                        NA                           NA                 NA                            8918                              3947                           NA                              NA
4                        NA                           NA                 NA                              NA                                 NA                            175                               175

基础R实现方法

如果不想依赖tidyverse包,也可以用基础R函数完成:

# 1. 拆分每行的文本条目
split_list <- strsplit(df$text, ",\\s*")

# 2. 逐个处理条目,提取数值和标签
processed <- lapply(split_list, function(x) {
  matches <- str_match(x, "^([0-9,]+)\\s+(.*)$")
  value <- as.numeric(gsub(",", "", matches[,2]))
  label <- matches[,3]
  data.frame(label, value, stringsAsFactors = FALSE)
})

# 3. 合并为长格式数据框
long_df <- do.call(rbind, lapply(seq_along(processed), function(i) {
  cbind(row_id = i, processed[[i]])
}))

# 4. 转换为宽格式
result_base <- reshape(
  long_df,
  idvar = "row_id",
  timevar = "label",
  direction = "wide",
  v.names = "value"
)

# 清理列名并移除行ID列
colnames(result_base) <- gsub("value\\.", "", colnames(result_base))
result_base <- result_base[,-1]

print(result_base)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:54:19