シャッフルしたい列だけを入れ替える

n1<-3 # 行
n2<-4 # 列
# これがデータレコード行列
M<-matrix(sample(1:(n1*n2)),n1,n2)
# シャッフル用の行列(行列のベクトル番地を値とする行列)
sM<-matrix(1:length(M),nrow(M),ncol(M))
# シャッフルしたい行
tobeshuffled<-2:4
# シャッフルしたい行だけ、シャッフルする
sM<-apply(sM[,tobeshuffled],2,sample)
# シャッフルしたくない行はシャッフルせず、シャッフルしたい行はシャッフルしたベクトル番地行列
sM2<-M
# 番地行列を使って入れ替える
sM2[,tobeshuffled]<-matrix(M[sM],n1,length(tobeshuffled))
sM2
  • 関数化
n1<-3
n2<-4
M<-matrix(sample(1:(n1*n2)),n1,n2)
# Mの列sをシャッフルして返す
ShuffleForPerm<-function(M,s=NULL){
	if(is.null(s)){
		s<-2:length(M[1,])
	}
	sM<-matrix(1:length(M),nrow(M),ncol(M))
	sM<-apply(sM[,s],2,sample)
	sM2<-M
	sM2[,s]<-matrix(M[c(sM)],nrow(M),length(s))
	sM2
}
ShuffleForPerm(M,s=2:4)