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

时间:2019-05-08 03:33:28

标签: r fixed-width

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

一个例子如下。

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

前四个变量的宽度为2,3,2,2,随后的变量仅为1。 我想要的结果应该像

N 27 P 3 CAABCABBDC

2 个答案:

答案 0 :(得分:2)

太糟糕了,您不能使用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

答案 1 :(得分:1)

这里有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)

请让我知道是否在任何情况下都失败。