Записать в фрейм данных Затем в .csv файл в R - PullRequest
2 голосов
/ 06 апреля 2020

Я хочу, чтобы вывод сильфона R был записан в файл .csv.

N <- c(15L, 20L)
SD <- c(1, 2) ^ 2
phi = c(0.2, 0.4)

## generate all combos
all_combos <- expand.grid(N = N, SD = SD, phi = phi)

## create function
fx_arima <- function(n, SD, phi) {
  (arima.sim(n = n,
            model=list(ar=phi, order = c(1, 1, 0)),
            start.innov = 4.1,
            n.start = 1,
            rand.gen = function(n) rnorm(n, mean = 0, sd = SD)))[-1]
}

## find arima for all combos using Map
Map(fx_arima, all_combos[["N"]], all_combos[["SD"]], all_combos[["phi"]])

## or :
set.seed(123L)
by(all_combos, all_combos["N"], 
   function(DF) {
     res = mapply(fx_arima, DF[["N"]], DF[["SD"]], DF[["phi"]])
     colnames(res) = paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "_")
     res
   })

Приведенный выше код R имитирует ARIMA(1,1,0) с различными значениями N <- c(15L, 20L), SD <- c(1, 2) ^ 2, phi = c(0.2, 0.4). N = 15 печатается в матрице, а N = 20 печатается в другой матрице для всех столбцов с именем столбца. Я хочу, чтобы каждая матрица была записана в datafram, а затем записана в файл .csv, который будет храниться в моем рабочем каталоге.

Я ОЖИДАЮ ЭТОГО

v1  v2   v3  v4 
1   4    3    1
2   6    3    2
3   8    3    12
4   4    4    8
5   6    4    4
6   8    4    0
7   4    5    2
8   6    5    1
9   8    5    2
10  11   12   13
11  12   13   14
8   6    5    1
9   8    5    2
10  11   12   13
11  12   13   14

Я попытался, что было сделано в Как записать вывод R с неравной длиной в Excel , но не смог получить

1 Ответ

1 голос
/ 06 апреля 2020

Сначала мы можем сохранить результаты в список, final.result.

final.result <- by(all_combos, all_combos["N"], 
   function(DF) {
     res = mapply(fx_arima, DF[["N"]], DF[["SD"]], DF[["phi"]])
     colnames(res) = paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "_")
     res
   })

Поскольку группа N находится в имени объекта, а не в именах столбцов, мы можем использовать al oop для добавления N к началу имен столбцов с помощью paste0. Тогда мы можем написать с write.table.

for(i in seq_along(final.result)){
  group <- names(finalresult)[i]
  colnames(final.result[[i]]) <- paste0("N_",group,"_",colnames(final.result[[i]]))
  write.table(final.result[[i]],sep=",",file="test.csv",append = TRUE)
}
...