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

时间:2015-08-28 13:07:07

标签: r layout dataframe probability dice

我已经创建了一个数据框,其中包含骰子投掷的所有可能结果,为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表格。

   [,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"

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

我们可以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方法,请通过paste'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"

或使用spread

中的tidyr的类似选项
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)

答案 1 :(得分:2)

以下是使用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"