2016-08-29 16 views
0

私は環境研究センターの仕事をしています。作物シミュレーションの使用する入力ファイルは.dlyです.csvファイルからデータフレームを取り出して、テーブルに必要なものを作ったこれらのデータフレームを.dly形式でエクスポートする必要があります。誰もこれを行う方法を知っていますか?ここでRから.dlyへのデータフレームの出力

+2

このリンクこれは単なるFWFファイルだと私に思い出させます。 http://www1.ncdc.noaa.gov/pub/data/ghcn/daily/readme.txtあなた自身で「研究」を行ったことがありますか? –

+0

Nice find @ 42-誰もが '.dly' ==をformatで固定しているわけではありません。ジョシュア:FWIW、セクションIIIを見る必要があります。あなたは 'gdata'パッケージを調査しない限り' write.fwf() 'がないので、'?cat'と '?sprintf'を提案したいと思います。 。 – hrbrmstr

答えて

1

は良いスタートかもしれないハッキングアップ機能です:

#' Write fixed-width-format files. 
#' 
#' @param x data.frame 
#' @param file character; if none provided, output to 
#' \code{\link{stdout}} 
#' @param widths numeric vector of same length as columns in 'x'; if 
#' missing, will determine by finding the longest string within each 
#' column; strings that are over this width are silently trimmed 
#' @param decimals integer, number of decimal places to preserve when 
#' printing the numbers (passed directly to \code{\link{round}}; if 
#' missing, no rounding is done 
#' @param header logical, whether to include the column names at the 
#' top of the file (may have an effect on auto-determined column 
#' widths 
#' @param justify character vector, indicates if each column should be 
#' justified 'l'eft or 'r'ight; may also be a single string with all 
#' columns, such as 'lrrlrll' 
#' @param space integer, number of spaces to place between data, 
#' generally only useful if widths are auto-generated 
#' @return nothing 
#' @export 
#' @examples 
#' \dontrun{ 
#' 
#' write.fwf(head(mtcars)) 
#' write.fwf(head(mtcars), space = 1) 
#' write.fwf(head(mtcars), decimals = 1, space = 1) 
#' write.fwf(head(mtcars), decimals = c(0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0), space = 1) 
#' write.fwf(head(mtcars), widths = c(4,6,5,8,3,8,3,3,8,8,6)) 
#' write.fwf(head(mtcars), header = FALSE, space = 1) 
#' write.fwf(head(mtcars), space = 1, justify = "lllllrrrrrr") 
#' 
#' } 
write.fwf <- function(x, file, widths, decimals, header = TRUE, 
         justify = "r", space = 0L) { 
    if (missing(file)) file <- stdout() 
    if (length(justify) == 1L && nchar(justify) > 1L) { 
     justify <- strsplit(justify, "")[[1]] 
    } 
    if (! length(justify) %in% c(1L, length(x))) { 
    stop("justify must be of length 1 or same as the number of columns in 'x'") 
    } 
    # convert to character, with/without header 
    xchar <- mapply(function(nm, vec, dec) { 
    c(if (header) nm, 
     if (is.numeric(vec)) sprintf(paste0("%0.", dec, "f"), vec) else as.character(a)) 
    }, names(x), x, if (missing(decimals)) "" else decimals, SIMPLIFY = FALSE) 
    if (missing(widths)) widths <- sapply(xchar, function(col) max(nchar(col))) 
    # enforce column widths 
    jsign <- ifelse(justify == "l", "-", "") 
    fmts <- mapply(paste0, "%", jsign, widths, "s", USE.NAMES = FALSE) 
    y <- mapply(function(fmt, wid, cvec) substr(sprintf(fmt, cvec), 1L, wid), 
       fmts, widths, xchar) 
    # print it out 
    spacechar <- paste(rep(" ", space), collapse = "") 
    cat(paste(paste0(apply(y, 1, paste, collapse = spacechar)), 
      collapse = "\n"), "\n", 
     file = file) 
    invisible() 
} 

使用例:

write.fwf(head(mtcars)) 
# mpgcyldisp hpdratwtqsecvsamgearcarb 
# 21 6 160110 4 3 16 0 1 4 4 
# 21 6 160110 4 3 17 0 1 4 4 
# 23 4 108 93 4 2 19 1 1 4 1 
# 21 6 258110 3 3 19 1 0 3 1 
# 19 8 360175 3 3 17 0 0 3 2 
# 18 6 225105 3 3 20 1 0 3 1 

write.fwf(head(mtcars), space = 1) 
# mpg cyl disp hp drat wt qsec vs am gear carb 
# 21 6 160 110 4 3 16 0 1 4 4 
# 21 6 160 110 4 3 17 0 1 4 4 
# 23 4 108 93 4 2 19 1 1 4 1 
# 21 6 258 110 3 3 19 1 0 3 1 
# 19 8 360 175 3 3 17 0 0 3 2 
# 18 6 225 105 3 3 20 1 0 3 1 

write.fwf(head(mtcars), decimals = c(2,0,0,0,1,2,0,0,0,0,0), space = 1) 
# mpg cyl disp hp drat wt qsec vs am gear carb 
# 21.00 6 160 110 3.9 2.62 16 0 1 4 4 
# 21.00 6 160 110 3.9 2.88 17 0 1 4 4 
# 22.80 4 108 93 3.8 2.32 19 1 1 4 1 
# 21.40 6 258 110 3.1 3.21 19 1 0 3 1 
# 18.70 8 360 175 3.1 3.44 17 0 0 3 2 
# 18.10 6 225 105 2.8 3.46 20 1 0 3 1 

write.fwf(head(mtcars), widths = c(4,6,5,8,3,8,3,3,8,8,6)) 
# mpg cyl disp  hpdra  wtqse vs  am gear carb 
# 21  6 160  110 4  3 16 0  1  4  4 
# 21  6 160  110 4  3 17 0  1  4  4 
# 23  4 108  93 4  2 19 1  1  4  1 
# 21  6 258  110 3  3 19 1  0  3  1 
# 19  8 360  175 3  3 17 0  0  3  2 
# 18  6 225  105 3  3 20 1  0  3  1 

(による列幅に名前の損失に気づく)

+0

'gdata' pkgにはすでに' read.fwf() 'があります。なぜ車を再発明するのですか? – hrbrmstr

+1

それは 'write.fwf' :-)も持っています。それは面白い挑戦(FWFライターを(再)する)のように思えたからです。 – r2evans

+0

少なくともこのアプリケーションでは、私は実際には列ヘッダーは必要ありません。列ヘッダーなしですべてを印刷するには、この関数をどのように変更しますか?私はそんなに尋ねることをお詫びします。私はまだ初心者ですが、私は予想以上に奇妙なことをするように求められました。 –

関連する問題