【问题标题】:How to write R output with unequal length into excel如何将长度不等的R输出写入excel
【发布时间】:2020-05-12 07:57:04
【问题描述】:

我有这个 R 代码来模拟时间序列数据,该系列有 5 个列和 35 个子

N <- c(15L, 20L, 30L, 50L, 100L)
SD = c(1, 2, 3, 4, 5) ^ 2
theta = c(0.2, 0.4, 0.6, 0.8, 0.9, 0.95, 0.99)

res <- vector('list', length(N))
names(res) <- paste('N', N, sep = '_')

set.seed(123L)
for (i in seq_along(N)){
  res[[i]] <- vector('list', length(SD))
  names(res[[i]]) <- paste('SD', SD, sep = '_')

  ma <- matrix(NA_real_, nrow = N[i], ncol = length(theta)) 

  for (j in seq_along(SD)){
    wn <- rnorm(N[i], mean = 0, sd = SD[j])
    ma[1:2, ] <- wn[1:2]

    for (k in 3:N[i]){
      ma[k, ] <- wn[k - 1L] * theta + wn[k]
    }
    colnames(ma) <- paste('ma_theta', theta, sep = '_')
    res[[i]][[j]] <- ma
  }
}

res

** 我期待这个**

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

我想将res 写入任何excel 文件。它可能是 .csv 文件。 我希望 1 在一个单元格中,2 在一个单元格中等等,而不是 12345 放在一个单元格中。

然后我把它写到一个excel文件中

【问题讨论】:

    标签: r write.table


    【解决方案1】:

    resmatrices的嵌套list,我们可以在循环list之后rbind

    res1 <- do.call(rbind, lapply(res, function(x) do.call(rbind, x))) 
    str(res1)
    # num [1:1075, 1:7] -0.56 -0.23 1.513 0.382 0.143 ...
    # - attr(*, "dimnames")=List of 2
    #  ..$ : NULL
    #  ..$ : chr [1:7] "ma_theta_0.2" "ma_theta_0.4" "ma_theta_0.6" "ma_theta_0.8" ...
    

    然后,write.table 像单个 matrix 一样工作


    如果我们需要cbind内部的list元素,由于行数不同,一个选项是cbind.fill from rowr

    library(rowr)
    out2 <- do.call(rbind, lapply(res, function(x) 
          do.call(cbind.fill, c(as.data.frame(x), fill = NA))))
    colnames(out2) <-  make.unique(rep(colnames(res[[1]][[1]]), length.out = ncol(out2)))
    

    更新

    如果我们需要多个 data.frame 输出,cbind list 元素

    res1 <- lapply(res, function(dat) do.call(cbind,  dat))
    sapply(names(res1), function(nm) write.csv(res1[[nm]], 
          file = paste0(nm, ".csv"), row.names = FALSE, quote = FALSE))
    

    【讨论】:

    • rbind 运行良好,文件写入 excel,但我希望输出按列排列
    • @DanielJames 您是否需要do.call(cbind, x) 如果是这种情况,并且您的行不同,请使用library(rowr); do.call(rbind, lapply(res, function(x) do.call(cbind.fill, c(as.data.frame(x), fill = NA))))
    • 我观察到每行的 7 个元素都写在一个单元格中。问题不在于写入过程,而在于输出。
    • @DanielJames 不太清楚你想要什么library(dplyr);out2 &lt;- bind_rows(lapply(res, function(x) as.data.frame(do.call(rbind, lapply(x, t)))))
    • res1 &lt;- lapply(res, function(x) do.call(rbind, lapply(x, t))) sapply(names(res1), function(nm) write.csv(res1[[nm]], file = paste0(nm, ".csv"), row.names = FALSE, quote = FALSE)) 搞定
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2013-02-20
    • 2015-08-12
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多