展平多个阵列

时间:2017-07-04 23:46:55

标签: arrays r

我正在尝试模仿文化传播。在该计划中,我有五个特征,每个特征有九个潜在的结果。

dimension <- 10 
characteristics <- 5 

world <- array(0, dim=c(dimension, dimension, characteristics))

for (i in 1:dimension){
  for (j in 1:dimension){
    for (k in 1:characteristics){
      world[i,j,k] <- sample(c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 1)
    }
  }
}

我希望能够展平数组并为每个潜在变体创建唯一标识符。例如,每个数组[1,1] =(0,0,0,0,0)= 1的世界一直到:(9,9,9,9,9)= 10 ^ 5。此外,这:(1,0,0,0,0)!=(0,0,1,0,0)等。任何关于如何展平尺寸的建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

您能提供一个具有所需形状的示例吗?怎么平和&#39;你要吗?这将五个特征叠加在一起,产生10 * 5行和10 + 1列(额外列表示&#39;特征&#39;)。

library(magrittr)
lst_ds <- purrr::map(seq_len(characteristics), ~tibble::as_tibble(world[,,.]))
ds <- lst_ds %>% 
  dplyr::bind_rows(.id = "characteristic")

产生

# A tibble: 50 x 11
   characteristic    V1    V2    V3    V4    V5    V6    V7    V8    V9   V10
            <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1              1     3     3     1     6     3     6     9     7     0     0
 2              1     7     4     8     8     8     9     7     2     4     4
 3              1     0     6     7     2     7     5     1     1     7     4
 4              1     0     6     3     4     5     1     9     3     1     3
 5              1     1     5     2     1     1     9     6     8     3     2
 6              1     6     5     6     5     4     3     2     0     6     1
 7              1     2     7     1     4     4     4     8     1     1     0
 8              1     0     7     6     1     3     9     0     8     6     1
 9              1     1     2     4     8     1     9     2     8     1     5
10              1     2     9     1     6     8     0     3     1     6     2
11              2     6     2     7     7     0     1     1     2     9     0
12              2     0     0     7     5     7     4     9     1     4     6
# ... with 38 more rows

答案 1 :(得分:0)

我现在以不同的方式解释你的“(9,9,9,9,9)= 10 ^ 5”符号。您是否想要列举所有可能的组合(即10 ^ 5)部分,并附上每个五重奏出现次数的计数?

将多维数据集转换为二维数据帧列表。如果你需要它们,可以使用一些尺寸指数。

library(magrittr)
lst_ds <- purrr::map(seq_len(characteristics), ~tibble::as_tibble(world[,,.]))
lst_ds <- purrr::map(lst_ds, function(d) { dplyr::mutate(d, dim1= seq_len(nrow(d))) })

转换为数据集的实体 - 属性 - 值样式(即超高)。

ds_eav <- lst_ds %>% 
  dplyr::bind_rows(.id = "characteristic") %>% 
  tidyr::gather(key=dim2, value=value, -characteristic, -dim1) %>% 
  dplyr::mutate(
    characteristic  = paste0("c", characteristic),
    dim2            = as.integer(sub("^V(\\d+)$", "\\1", dim2))
  )

加宽,以便每个观察到的五重奏占据自己的行。

ds_quintet <- ds_eav %>% 
  tidyr::spread(key=characteristic, value=value)

枚举可能的五重奏。

ds_possible <- tidyr::crossing(
  c1 = 0:9,
  c2 = 0:9,
  c3 = 0:9,
  c4 = 0:9,
  c5 = 0:9
)

计算观察到的五重奏,然后将它们与所有10 ^ 5个可能的值连接起来。并将NA替换为ds_obs中从未发生过的零。

ds_obs <- ds_quintet %>% 
  dplyr::select(-dim1, -dim2) %>% 
  dplyr::group_by(c1, c2, c3, c4, c5) %>% 
  dplyr::summarize(
    frequency = n()
  ) %>% 
  dplyr::ungroup() %>% 
  dplyr::right_join(ds_possible, by=c("c1", "c2", "c3", "c4", "c5")) %>% 
  dplyr::mutate(
    frequency   = dplyr::coalesce(frequency, 0L)
  ) %>% 
  dplyr::arrange(c1, c2, c3, c4, c5)

看起来像:

 A tibble: 100,000 x 6
      c1    c2    c3    c4    c5 frequency
   <dbl> <dbl> <dbl> <dbl> <dbl>     <int>
 1     0     0     0     0     0         0
 2     0     0     0     0     1         0
 3     0     0     0     0     2         2
 4     0     0     0     0     3         0
 5     0     0     0     0     4         0
 6     0     0     0     0     5         0
 7     0     0     0     0     6         1
 8     0     0     0     0     7         0
 9     0     0     0     0     8         0
10     0     0     0     0     9         0
# ... with 99,990 more rows