我正在尝试模仿文化传播。在该计划中,我有五个特征,每个特征有九个潜在的结果。
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 :(得分: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