2017-07-04 10 views
0

私は文化の普及をモデル化しようとしています。このプログラムでは、特性ごとに5つの特性と9つの潜在的な結果があります。複数の配列をまとめる

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)などです。寸法を平らにする方法に関する提案は非常に高く評価されます。

+0

'ダイジェスト::ダイジェスト(世界を、[1、1、])'あなたにそれぞれの可能なシーケンスのためのユニークな値を取得します。私はあなたのためにIDを使用することを目指しているか分からない。 – Marius

答えて

0

希望の形状の例を提供できますか?どのように 'フラット'それをしたいですか?これにより、5つの特性がお互いに積み重ねられ、結果として10行×5行と10 + 1列(余分の列は「特性」を表します)になります。

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 
0

私は解釈していますが、あなたの異なっ今の表記 "(9,9,9,9,9)が10^5 ="。列挙されたすべての組み合わせ(すなわち、10^5)の部分に、各五重奏が何回出現するかを数えますか?

キューブを2dデータフレームのリストに変換します。そしてあなたがどこかにそれらを必要とするなら、いくつかの次元指数。

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 
関連する問題