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

Convert data saved in a comma delimited format to a fixed width format without package

我有一个以逗号分隔格式保存的数据文件。但是,应该将其转换为具有固定宽度的字符串格式。我知道那里有一个包 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

可惜你不能使用gdata。你可以在事后将列粘贴在一起

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

假设仅提供前 N-1 个固定宽度,其余字符始终折叠成一个字符串,这里还有 2 种可能的方法:

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)

如果这对任何边缘情况都失败了,请告诉我。