R 如何写入固定宽度的文件?

R 如何写入固定宽度的文件?,r,fixed-width,R,Fixed Width,我应该基于固定宽度列(例如,第1-8列中的第1个变量,第9-15列中的第2个变量…)以特定格式编写txt文件 原始数据的长度不同,必须放在指定列的右侧。 例如:值“-15.96”和“12.489”必须写入第一行和第二行的第1-8列,而“-872.6”和“1723.6”必须写入第9-15列。这将是: 123456789012345 (n columns) -15.96 -872.6 12.489 1723.6 我怎么能用R做到这一点?现在我有一个简单的表,如下所示: x <- da

我应该基于固定宽度列(例如,第1-8列中的第1个变量,第9-15列中的第2个变量…)以特定格式编写txt文件

原始数据的长度不同,必须放在指定列的右侧。 例如:值“-15.96”和“12.489”必须写入第一行和第二行的第1-8列,而“-872.6”和“1723.6”必须写入第9-15列。这将是:

123456789012345 (n columns)
  -15.96 -872.6
  12.489 1723.6
我怎么能用R做到这一点?现在我有一个简单的表,如下所示:

x <- data.frame(a= sample(-500.5:500.8,4),
                b= sample(-250.6:420.9,4))

x使用
sprintf
help(sprintf)
获取更多信息)格式化,然后用
writeLines
写出行。没有使用任何软件包

filename <- stdout() # change to your file name
Lines <- with(x, sprintf("%8.2f%7.1f", a, b))
writeLines(Lines, filename)
##  -212.50  380.4
##   288.50 -220.6
##   -92.50  102.4
##   381.50  346.4

filename使用
sprintf
对其进行格式化(
help(sprintf)
了解更多信息),然后用
writeLines
写出行。没有使用任何软件包

filename <- stdout() # change to your file name
Lines <- with(x, sprintf("%8.2f%7.1f", a, b))
writeLines(Lines, filename)
##  -212.50  380.4
##   288.50 -220.6
##   -92.50  102.4
##   381.50  346.4

filename下面是一个使用Grothendieck答案的自动化版本

#“在R中生成固定宽度的文件
#“@description此简单函数用于创建固定宽度的文件,无
#'额外依赖项。
#“@param将左、右、左的“l”、“r”或类似“lrl”的东西对齐。
#"(0){
用于(以fct\U col表示的i){

dt[,i]这里有一个更自动化的版本,使用Grothendieck的答案

#“在R中生成固定宽度的文件
#“@description此简单函数用于创建固定宽度的文件,无
#'额外依赖项。
#“@param将左、右、左的“l”、“r”或类似“lrl”的东西对齐。
#"(0){
用于(以fct\U col表示的i){

dt[,i]gdata
包有一个
write.fwf
函数。请看`。我很惊讶你没有在谷歌上找到它。我也很惊讶,谢谢。gdata
包有一个
write.fwf
函数。请看`。我很惊讶你没有在谷歌上找到它。我也很惊讶,谢谢。
#' Generate fixed width file in R
#' @description This simple function creates fixed width file with no 
#' extra dependencies. 
#' @param justify "l", "r" or something like "lrl" for left, right, left. 
#' @examples dt <- data.frame(a = 1:3, b = NA, c = c('a', 'b', 'c'))
#' write_fwf(dt, "test.txt", width = c(4, 4, 3))
#' @export
write_fwf = function(dt, file, width, 
                     justify = "l", replace_na = "NA") {
  fct_col = which(sapply(dt, is.factor))
  if (length(fct_col) > 0) {
    for (i in fct_col) {
      dt[,i] <- as.character(dt[,i])
    }
  }
  dt[is.na(dt)] = replace_na
  n_col = ncol(dt)
  justify = unlist(strsplit(justify, ""))
  justify = as.character(factor(justify, c("l", "r"), c("-", "")))
  if (n_col != 1) {
    if (length(width) == 1) width = rep(width, n_col)
    if (length(justify) == 1) justify = rep(justify, n_col)
  }
  sptf_fmt = paste0(
    paste0("%", justify, width, "s"), collapse = ""
  )
  tbl_content = do.call(sprintf, c(fmt = sptf_fmt, dt))
  tbl_header = do.call(sprintf, c(list(sptf_fmt), names(dt)))
  out = c(tbl_header, tbl_content)
  writeLines(out, file)
}