【问题标题】:Write to Data Frame Then to .csv file in R写入数据框然后写入 R 中的 .csv 文件
【发布时间】:2020-04-06 12:43:20
【问题描述】:

我希望将下面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 &lt;- c(15L, 20L), SD &lt;- 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

我尝试了How to write R output with unequal length into excel 中所做的操作,但无法得到它

【问题讨论】:

  • Map(fx_arima, all_combos[["N"]], all_combos[["SD"]], all_combos[["phi"]]) 返回一个长度为 8 的列表,你想在 csv 中怎么写?不同csv中的每个列表都有一列?还是一个组合的 csv?

标签: r export-to-csv write.table


【解决方案1】:

我们可以先将结果保存到列表中,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 组位于对象名称中而不是列名称中,所以我们可以使用循环将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)
}

【讨论】:

  • Warning messages: 1: In write.table(final.result[[i]], sep = ",", file = "~/test.csv", : appending column names to file 2: In write.table(final.result[[i]], sep = ",", file = "~/test.csv", : appending column names to file
  • sapply(names(final.result), function(nm) write.csv(final.result[[nm]], file = paste0(nm, ".csv"), row.names = FALSE, quote = FALSE)) 帮助
  • 我认为sapply 解决方案更好,如果你没有给final.result 一个名字,我就不会到达那个。请采纳这一点,让我给你功劳,因为我已经做了一天了。
  • 很遗憾地通知您,即使在您更新后警告仍然存在并且在 Windows 上没有产生任何结果。
猜你喜欢
  • 2017-03-29
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2015-12-13
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多