我有一个用逗号分隔格式保存的数据文件。但是,应将其转换为具有固定宽度的字符串格式。我知道那里有一个包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
答案 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)
请让我知道是否在任何情况下都失败。