在R语言中将含分数的多列文本拆分为多列的实现方法
问题解决:R语言分数列拆分与转换
错误原因分析
你提供的代码存在几个关键问题:
across语法错误:不能在across内部直接用=赋值生成新列,正确方式是通过list定义多列转换规则,配合.names参数指定新列名- 列名与列值混淆:
.x在across中代表当前列的数值向量,不是列名,用paste0(.x, "Numerator")会把每个分数值和字符串拼接,而非生成列名 - 函数参数错误:
str_extract的第一个参数应该是.x(当前列),而非. - 代码未闭合:缺少
mutate和across的闭合括号
正确实现代码
首先加载所需包,然后执行转换:
library(dplyr) library(stringr) # 原始数据框 df <- structure(list(Initial_Data = c("18/24", "4/24"), `3Mo_Data` = c("14/14", NA), `6Mo_Data` = c(NA, "6/14"), Irrelevant_Col1 = 1:0, Irrelevant_Col2 = 1:0), class = "data.frame", row.names = c(NA, -2L)) # 处理分数列,生成小数、分子、分母列,保留无关列 result_df <- df %>% mutate( across( contains("Data"), list( # 提取分子并转为整数 Numerator = ~ as.integer(str_extract(.x, "^\\d+")), # 提取分母并转为整数(匹配/后的数字) Denominator = ~ as.integer(str_extract(.x, "(?<=/)\\d+")), # 计算分数对应的小数,处理NA情况 Decimal = ~ ifelse(is.na(.x), NA, as.integer(str_extract(.x, "^\\d+")) / as.integer(str_extract(.x, "(?<=/)\\d+"))) ), # 新列命名规则:原列名_函数名(如Initial_Data_Numerator) .names = "{.col}_{.fn}" ) ) %>% # 可选:调整列顺序,将Data相关列放在前面 select(contains("Data"), everything())
输出结果
执行后result_df的结构如下:
Initial_Data 3Mo_Data 6Mo_Data Initial_Data_Numerator Initial_Data_Denominator Initial_Data_Decimal 3Mo_Data_Numerator 3Mo_Data_Denominator 3Mo_Data_Decimal 6Mo_Data_Numerator 6Mo_Data_Denominator 6Mo_Data_Decimal Irrelevant_Col1 Irrelevant_Col2 1 18/24 14/14 NA 18 24 0.75 14 1 1.00 NA NA 1 1 2 4/24 NA 6/14 4 24 0.17 NA NA NA 6 14 0.43 0 0
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

