将多列数据框转换为 R 中的 3D 矩阵

Convert multiple columned dataframe to 3D matrix in R

我有一个类似于下面的数据框:

trial Card1_colour Card1_number Card1_shape Card2_colour Card2_number Card2_shape  ......
1        1                1           0           0           1            1
2        0                0           0           1           1            1
3        1                0           0           0           0            0
4        0                0           1           0           0            1
5        1                1           1           1           0            1
.
.
.
.

除了我的实际数据框有 12 个 'Card' 变量,Card1_colour : Card4_shape.

#Code for generating example data

data<-matrix(rbinom(20*12, 1, .5), ncol=12)
trial<-seq(from = 1, to = 20)

data<-cbind(trial,data)
data<-as.data.frame(data)

colnames(data)[2] <- "Card1_colour"
colnames(data)[3] <- "Card1_number"
colnames(data)[4] <- "Card1_shape"
colnames(data)[5] <- "Card2_colour"
colnames(data)[6] <- "Card2_number"
colnames(data)[7] <- "Card2_shape"
colnames(data)[8] <- "Card3_colour"
colnames(data)[9] <- "Card3_number"
colnames(data)[10] <- "Card3_shape"
colnames(data)[11] <- "Card4_colour"
colnames(data)[12] <- "Card4_number"
colnames(data)[13] <- "Card4_shape"

我想将我的数据重塑为 n(试验)x 4 x 3 矩阵,看起来像这样:

trial Card Colour Number Shape
1      1     1      1      0
1      2     0      1      1
1      3     0      1      0
1      4     1      1      1
2      1     1      0      0
2      2     1      1      0
2      3     0      1      1
2      4     1      1      0

换句话说,每次试验的卡片 1 - 卡片 4 将成为行变量,而颜色、形状和数字仍然是列变量。

感谢任何帮助!谢谢

您可以使用 tidyr 中的 pivot_longer :

tidyr::pivot_longer(data, cols = -trial, 
                    names_to = c('Card', '.value'), 
                    names_pattern = 'Card(\d+)_(.*)')

# A tibble: 80 x 5
#   trial Card  colour number shape
#   <int> <chr>  <int>  <int> <int>
# 1     1 1          0      1     1
# 2     1 2          0      1     1
# 3     1 3          0      0     0
# 4     1 4          0      0     0
# 5     2 1          1      0     1
# 6     2 2          0      1     0
# 7     2 3          1      0     1
# 8     2 4          0      1     0
# 9     3 1          0      1     1
#10     3 2          0      1     1
# … with 70 more rows

我们可以使用 names_sepnames_prefix

library(tidyr)
pivot_longer(data, cols = -trial, names_to = c('Card', '.value'), 
        names_prefix='Card', names_sep='_')
# A tibble: 80 x 5
#   trial Card  colour number shape
#   <int> <chr>  <int>  <int> <int>
# 1     1 1          0      0     1
# 2     1 2          0      0     0
# 3     1 3          1      0     1
# 4     1 4          1      0     1
# 5     2 1          0      1     1
# 6     2 2          0      0     1
# 7     2 3          0      1     0
# 8     2 4          1      0     1
# 9     3 1          1      1     1
#10     3 2          1      1     0
# … with 70 more rows