将 2x36 数据帧重组为 6x6 数据帧。掷骰子可视化

Reorganise 2x36 dataframe to a 6x6 dataframe. Dice throw visualisation

我创建了一个数据框,其中包含掷骰子的所有可能结果,作为 2x36 数据框。

    d1  d2
1   1   1
2   2   1
3   3   1
4   4   1
5   5   1
6   6   1
7   1   2
8   2   2
9   3   2
10  4   2
11  5   2
12  6   2
13  1   3
14  2   3
15  3   3
16  4   3
17  5   3
18  6   3
19  1   4
20  2   4
21  3   4
22  4   4
23  5   4
24  6   4
25  1   5
26  2   5
27  3   5
28  4   5
29  5   5
30  6   5
31  1   6
32  2   6
33  3   6
34  4   6
35  5   6
36  6   6

为了使这个视觉效果更赏心悦目,我想将其重新组织为 6x6 table。

   [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] "1 1" "1 2" "1 3" "1 4" "1 5" "1 6"
[2,] "2 1" "2 2" "2 3" "2 4" "2 5" "2 6"
[3,] "3 1" "3 2" "3 3" "3 4" "3 5" "3 6"
[4,] "4 1" "4 2" "4 3" "4 4" "4 5" "4 6"
[5,] "5 1" "5 2" "5 3" "5 4" "5 5" "5 6"
[6,] "6 1" "6 2" "6 3" "6 4" "6 5" "6 6"

我该如何实现?

我们可以 paste 列并使用 matrix 指定维度

matrix(do.call(paste, df1), ncol=6)
#     [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
#[1,] "1 1" "1 2" "1 3" "1 4" "1 5" "1 6"
#[2,] "2 1" "2 2" "2 3" "2 4" "2 5" "2 6"
#[3,] "3 1" "3 2" "3 3" "3 4" "3 5" "3 6"
#[4,] "4 1" "4 2" "4 3" "4 4" "4 5" "4 6"
#[5,] "5 1" "5 2" "5 3" "5 4" "5 5" "5 6"
#[6,] "6 1" "6 2" "6 3" "6 4" "6 5" "6 6"

如果只有两列,我们也可以paste通过单独对列进行子集化

matrix(paste(df1[,1], df1[,2]), ncol = 6)

如果您需要 dcast/acast 方法,请通过 pasteing 'df1' 的列创建另一列,然后执行 acast.

library(reshape2)
acast(data.frame(df1, value=do.call(paste, df1), stringsAsFactors=FALSE), ar~br)
#    1     2     3     4     5     6    
#1 "1 1" "1 2" "1 3" "1 4" "1 5" "1 6"
#2 "2 1" "2 2" "2 3" "2 4" "2 5" "2 6"
#3 "3 1" "3 2" "3 3" "3 4" "3 5" "3 6"
#4 "4 1" "4 2" "4 3" "4 4" "4 5" "4 6"
#5 "5 1" "5 2" "5 3" "5 4" "5 5" "5 6"
#6 "6 1" "6 2" "6 3" "6 4" "6 5" "6 6"

或使用来自 tidyr

spread 的类似选项
library(dplyr)
library(tidyr)
df1 %>%
   mutate(value= paste(ar, br)) %>%
   spread(br, value)

但是,这可以直接使用 outer

创建
outer(1:6, 1:6, FUN= paste)

数据

df1 <- expand.grid(ar=1:6, br=1:6)

这是使用 lapplyapply

的基础 R 替代方案
out =  do.call(rbind,
                lapply(split(data, data$d2),function(x) 
                apply(x, 1, function(y) paste(y['d2'], y['d1'], collapse = ' '))
               )
#>out                
#     1     2     3     4     5     6    
#1 "1 1" "1 2" "1 3" "1 4" "1 5" "1 6"
#2 "2 1" "2 2" "2 3" "2 4" "2 5" "2 6"
#3 "3 1" "3 2" "3 3" "3 4" "3 5" "3 6"
#4 "4 1" "4 2" "4 3" "4 4" "4 5" "4 6"
#5 "5 1" "5 2" "5 3" "5 4" "5 5" "5 6"
#6 "6 1" "6 2" "6 3" "6 4" "6 5" "6 6"