将 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
方法,请通过 paste
ing '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)
这是使用 lapply
和 apply
的基础 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"
我创建了一个数据框,其中包含掷骰子的所有可能结果,作为 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
方法,请通过 paste
ing '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)
这是使用 lapply
和 apply
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"