如何在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
相关产品推荐
相关产品推荐

