按固定字符宽度拆分无分隔符列:R语言实现遇阻求助
问题分析与解决
你的代码存在的几个问题:
- 循环范围错误:
seq(1:length(widths)-1)会漏掉最后一个变量,应该用seq_along(widths)遍历所有宽度值。 - 动态列命名语法错误:
mutate({{var_name}}, ...)不是正确的赋值写法,需要用{{var_name}} := ...来创建动态命名的列。 - 管道内引用外部数据框:在管道中直接写
ficheiro$data会破坏管道上下文,应该直接用列名data。 - start变量未初始化:你没给
start赋初始值,第一次循环时start是未定义状态,会导致计算错误。 - substr参数错误:
substr的第三个参数是结束位置,不是长度,之前的start + widths[i]会多取一个字符,正确应该是start + widths[i] - 1。
修正后的循环代码:
# 初始化起始位置 start <- 1 # 遍历所有宽度和列名 for(i in seq_along(widths)){ var_name <- colnames[i] ficheiro <- ficheiro %>% mutate({{var_name}} := substr(data, start, start + widths[i] - 1)) start <- start + widths[i] }
更简洁的tidyverse方案(推荐)
用tidyr::separate_wider_position可以一步完成拆分,不用写循环:
library(tidyr) ficheiro <- ficheiro %>% separate_wider_position( cols = data, widths = set_names(widths, colnames) )
这个函数专门用于按固定宽度拆分字符列,直接指定原列、各新列的宽度和名称即可,比循环高效且易读。
基础R方案
如果不用tidyverse,read.fwf也能处理:
# 将单列数据转为文本流,再按固定宽度读取 split_data <- read.fwf( textConnection(ficheiro$data), widths = widths, col.names = colnames ) # 合并回原数据框(若需保留原列) ficheiro <- cbind(ficheiro, split_data)
内容的提问来源于stack exchange,提问作者Ana Castanheira
相关产品推荐
相关产品推荐

