将多维数组从 R 导出到电子表格

exporting a multidimensional array from R to a spreadsheet

所以我试图将多维数组从 R 导出到 excel、google 工作表或一些类似的电子表格程序中。我也可以导出到文本文件,只要它是我需要的格式即可。我也上网了,但是进步不大。

注意:我有一些编程经验(大约 4 个学期),但对 R 比较陌生。我和另外 3 个人一起工作,他们之前几乎没有编程经验。

我们的数组是 7x100x100(尽管我以后可能不得不把它变大)。 我已经能够将它导出到 excel 电子表格中,但是它的格式化方式让我的工作变得有点困难。所以我有一百个 7x100 矩阵,excel 只是将它们并排(水平)放置。我想以一种更容易区分矩阵的方式导出它。

举个例子...如果我有一个尺寸为 2x3x4 的多维数组,并且我在 RStudio 中(在控制台中)打印结果,这就是显示的内容:

, , 1

      [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

, , 2

      [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

, , 3

      [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

, , 4

      [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

我喜欢我如何区分每个 2x3 矩阵,因为它们一个接一个地堆叠(但垂直,而不是水平)

然而,在 excel,这是我得到的:

这是我在上面的例子中使用的代码。

results <- array(0, dim = c(2,3,4))
write.csv(results,"test3.csv")

我想以某种方式对其进行修改,以便矩阵彼此区分,或者使它们垂直堆叠而不是水平堆叠。

注意:我们的实际数据不仅仅是一堆零...这只是一个例子,以使其更简单。最终,我们将生成 7x100 矩阵以在 for 循环中放入此数组,我们需要以一种便于稍后分析数据的方式保存每个生成的矩阵。

感谢您提供的任何帮助!!!我试着说得具体一点,但如果有任何其他信息有用,请告诉我。

这里有两个选项,一个是用基数 R apply 来制作矩阵,另一个是 dplyr 解决方案。首先,我用值 1:24 重新创建了数组,以便更容易检查所有内容是否就位,而不是检查是否所有内容都为 0.

library(tidyverse)

arr <- array(1:24, dim = c(2,3,4))

您可以跨列创建一个大矩阵,其中较小的 table 基本上垂直堆叠。然后,您可以将其设为数据框或将其写入文件。

apply(arr, MARGIN = 2, function(a) as.matrix(a))
#>      [,1] [,2] [,3]
#> [1,]    1    3    5
#> [2,]    2    4    6
#> [3,]    7    9   11
#> [4,]    8   10   12
#> [5,]   13   15   17
#> [6,]   14   16   18
#> [7,]   19   21   23
#> [8,]   20   22   24

在第二种方式中,我从 获得了第一行(lapply 调用); returns 四个矩阵的列表。之后,您可以使用 purrr::imap_dfr 映射矩阵并创建数据框,从而产生一个数据框。这里的一个额外好处是您可以 mutate 一列来标记,例如table 每个观察来自什么。

# 
n3 <- dim(arr)[3]
lapply(1:n3, function (i) arr[,,i]) %>%
  imap_dfr(function(mtx, i) {
    as.data.frame(mtx) %>%
      mutate(table = paste("table", i, sep = "_"))
  })
#>   V1 V2 V3   table
#> 1  1  3  5 table_1
#> 2  2  4  6 table_1
#> 3  7  9 11 table_2
#> 4  8 10 12 table_2
#> 5 13 15 17 table_3
#> 6 14 16 18 table_3
#> 7 19 21 23 table_4
#> 8 20 22 24 table_4

reprex package (v0.2.0) 创建于 2018-06-20。