Я должен написать текстовый файл в определенном формате на основе столбцов с фиксированной шириной (например, 1-я переменная в столбцах 1-8, 2-я переменная в столбцах 9-15...).
Исходные данные имеют разную длину и должны располагаться справа от назначенных столбцов. Например: значения «-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))
Я тоже удивлен, спасибо.





Отформатируйте его с помощью 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
Вторая строка может быть альтернативно написана:
Lines <- do.call("sprintf", c("%8.2f%7.1f", x))
Вот более автоматизированная версия, использующая ответ Гротендика.
https://gist.github.com/haozhu233/28d1309b58431f4929f78243054f1f58
#' 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)
}
Пакет
gdataимеет функциюwrite.fwf. См. stackoverflow.com/a/50499905/2372064`. Я удивлен, что вы не нашли это в гугле.