将以逗号分隔格式保存的数据转换为不带包的固定宽度格式

Posted

技术标签:

【中文标题】将以逗号分隔格式保存的数据转换为不带包的固定宽度格式【英文标题】:Convert data saved in a comma delimited format to a fixed width format without package 【发布时间】:2019-05-08 03:33:27 【问题描述】:

我有一个以逗号分隔格式保存的数据文件。但是,它应该转换为具有固定宽度的字符串格式。我知道那里有一个包 gdata。但是,由于一些技术限制,我无法安装该软件包。如果没有包,我知道的唯一方法是通过指定格式来使用sprintf。但是,我确实有 100 多个变量。因此,为每个变量编写格式非常繁琐。谁能帮我解决这个问题?任何帮助将不胜感激。

一个例子如下。

x<-data.frame(matrix(c("N",27,"P",3,"C","A","A","B","C","A","B","B","D","C"),nrow=1))

前4个变量的宽度是2,3,2,2,后面的变量只有1。 我想要的结果应该是这样的

N 27 P 3 CAABCABBDC

【问题讨论】:

您对tidyverse 开放吗?还是只在基地寻找解决方案? x %&gt;% unite(combine, names(x), sep = "") %&gt;% separate(combine, into = paste0("V", 1:5), sep = c(1, 3, 4, 5)) 可以吗? 【参考方案1】:

很遗憾,您不能使用 gdata。你可以在事后将cols粘贴在一起

x<-data.frame(matrix(c("N",27,"P",3,"C","A","A","B","C","A","B","B","D","C"),nrow=1))

cols <-5:ncol(x) 
x$newccol <- apply( x[ ,cols] , 1 , paste , collapse = "" )
x[ ,cols ] <- NULL

【讨论】:

【参考方案2】:

这里有另外 2 种可能的方法,假设只提供前 N-1 个固定宽度,其余字符总是折叠成一个字符串:

1) 使用base::substring

s <- "N27P3CAABCABBDC"
l <- c(2L,3L,2L,2L)
l <- c(l, nchar(s) - (sum(l) - length(l)) + 1L)
start <- c(1L, head(cumsum(l - 1L) + 1L, -1L))
stop <- cumsum(l - 1L)
paste(substring(s, start, stop), collapse=" ")

2) 使用base::gsub

s <- "N27P3CAABCABBDC"
l <- c(2L,3L,2L,2L)
p <- paste(
    lapply(c(l - 1L, nchar(s) - sum(l-1L)), function(n) sprintf("([[:alnum:]]%d)", n)),
    collapse="")
r <- paste(
    paste0("\\", seq_len(length(l)+1L)),
    collapse=" ")
gsub(p, r, s)

如果在任何边缘情况下失败,请告诉我。

【讨论】:

以上是关于将以逗号分隔格式保存的数据转换为不带包的固定宽度格式的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL(CSV)格式文件如何转换为带逗号分隔符的TXT文件

PHP数字格式不带逗号

Razor输入框逗号分隔转换

逗号分隔的文本文件到通用列表

如何修改excel转换csv的分隔符

业务数据采集