对应稀疏矩阵 转为 宽数据框,见
- 数据格式转换 | 稀疏矩阵3列还原为原始矩阵/数据框,自定义函数 df3toMatrix()
目的:比如查看鸢尾花整体的指标分布,4个指标分开,画到一个图中。每个品种画一个图。
1.数据整理:宽变长 手工版
dat0=iris
dat=unlist(dat0[,1:4]) |> as.data.frame()
colnames(dat)="val"
dim(dat) #600 1dat$obs= rep( rownames(dat0), times=ncol(dat0[,1:4]) )
dat$variation= rep( colnames(dat0[,1:4]), each=nrow(dat0[,1:4]) )
dat$Species= rep( dat0$Species, times=ncol(dat0[,1:4]) )
dim(dat) # 600 4
head(dat)
# val obs variation Species
#Sepal.Length1 5.1 1 Sepal.Length setosa
#Sepal.Length2 4.9 2 Sepal.Length setosa
2.画图
colorset.types=ggsci::pal_npg()(5)[c(1,2,4,5)]
scales::show_col(colorset.types)
library(ggplot2)
ggplot(dat, aes(val, fill=variation))+geom_density(linewidth=1, alpha=0.5)+facet_grid(Species~., scale="free_y")+theme_bw(base_size = 14)+scale_fill_manual("Species", values = colorset.types, #breaks = my.breaks, labels=my.labels)+#scale_x_discrete(breaks = my.breaks, labels = my.labels) +labs(x="Length")
3. 原理
原理1:rep() 重复的方式,整体重复times=,每个元素分别重复 each=
rep(c("a", "b"), times=2) #"a" "b" "a" "b"
rep(c("a", "b"), each=2) #"a" "a" "b" "b"
原理2: 对数据框做 unlist() 默认是按列展开。
数学中矩阵是列向量。
> head(iris[1:2, 1:4])Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
> unlist(iris[1:2, 1:4])
Sepal.Length1 Sepal.Length2 Sepal.Width1 Sepal.Width2 Petal.Length1 Petal.Length2 Petal.Width1 Petal.Width2 5.1 4.9 3.5 3.0 1.4 1.4 0.2 0.2
End.