将多列数据框转换为 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_sep
和 names_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
我有一个类似于下面的数据框:
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_sep
和 names_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