2017-03-01 18 views
0

データフレームからグループ/ファセットでコレログラムをプロットしようとしています。変数ごとにデータをサブセット化すると、これを行うことができます。各変数に基づいてファセットプロットを生成するために、一度にすべての変数に対してこれを行うにはどうすればよいですか?ファセットまたはグループ化された相関関係とコレログラムプロットR

###Load libraries 
library(gdata) 
library(corrplot) 
library(ggplot2) 
library(gtable) 
library(ggpmisc) 
library(grid) 
library(reshape2) 
library(plotly) 
packageVersion('plotly') 

##Subset ample data from the "iris" data set in R 
B<-iris[iris$Species == "virginica", ] 

##calculate correlation for numeric columns only 
M<-cor(B[,1:4]) 
head(round(M,2)) 

###calculate significance 
cor.mtest <- function(mat, ...) { 
mat <- as.matrix(mat) 
n <- ncol(mat) 
p.mat<- matrix(NA, n, n) 
diag(p.mat) <- 0 
for (i in 1:(n - 1)) { 
    for (j in (i + 1):n) { 
     tmp <- cor.test(mat[, i], mat[, j], ...) 
     p.mat[i, j] <- p.mat[j, i] <- tmp$p.value 
    } 
} 
colnames(p.mat) <- rownames(p.mat) <- colnames(mat) 
p.mat 
} 
# matrix of the p-value of the correlation 
p.mat <- cor.mtest(B[,1:4]) 

###plot 
#color ramp 
col<- colorRampPalette(c("red","white","blue"))(40) 
corrplot(M, type="upper",tl.col="black", tl.cex=0.7,tl.srt=45, col=col, 
p.mat = p.mat, insig = "blank", sig.level = 0.01) 

データフレームから変数「virginica」を1つ取り出したので、これはうまくいきます。一意の相関計算を持つようにこれを自動化するにはどうすればよいのですか?

答えて

1

私は、それぞれSpeciesレベルのコルプロットが必要だと理解しています。 だから、あなたは試すことができます:

library(Hmisc) # this package has implemented a cor function calculating both r and p. 
library(corrplot) 
# split the data 
B <- split(iris[,1:4], iris$Species) 
# Calculate the correlation in all data.frames using lapply 
M <- lapply(B, function(x) rcorr(as.matrix(x))) 

# Plot three pictures 
par(mfrow=c(1,3)) 
col<- colorRampPalette(c("red","white","blue"))(40) 
lapply(M, function(x){ 
corrplot(x$r, type="upper",tl.col="black", tl.cex=0.7,tl.srt=45, col=col, 
     p.mat = x$P, insig = "blank", sig.level = 0.01) 
}) 

enter image description here

+0

OKでも、回答を受け入れたものとしてマークすることもできます。 – Jimbou

0

@Jimbou、あなたのコードに感謝を。相関分析、ユニークなRとプロットを1つのコードに追加し、各プロットに固有の名前を追加するために少し編集しました。 Plot with titles

library(ggplot2) 
library(Hmisc) 
library(corrplot) 
# split the data 
B <- split(iris[,1:4], iris$Species) 
##extract names 
nam<-names(B) 
# Plot three pictures 
par(mfrow=c(1,3)) 
col<- colorRampPalette(c("red","white","blue"))(40) 
for (i in seq_along(B)){ 
# Calculate the correlation in all data.frames using lapply 
M<-rcorr(as.matrix(B[[i]])) 
corrplot(M$r, type="upper",tl.col="black", tl.cex=0.7,tl.srt=45, col=col, 
addCoef.col = "black", p.mat = M$P, insig = "blank",sig.level = 0.01) 
mtext(paste(nam[i]),line=1,side=3)} 
関連する問題