dplyr ですべての列から代表を抽出 数値とカテゴリカルの混ざったデータの整理

https://www.listendata.com/2016/08/dplyr-tutorial.html

summarise_ifとかsummrise_allとかのがよさげ
基本

x<-rnorm(1000)
y<-rnorm(1000)
z<-rnorm(1000)

g<-sample(1:5,1000,replace=T)
s<-data.frame(x,y,z,g)

s%>% group_by(g) %>% dplyr::summarise_each(funs(min,mean,max),everything())

グループの代表値を取得

x<-rnorm(1000)
y<-rnorm(1000)
z<-rnorm(1000)
l<-sample(c("a","b","c"),1000,replace=T)

g<-sample(paste(1:5),1000,replace=T)
s<-data.frame(x,y,z,g,l)

rep2<-function(x){
	if(class(x)=="integer" | class(x)=="numeric"){
		median(x,na.rm=T)
	}else{
		if(length(x[!is.na(x)])!=0){
			sample(x[!is.na(x)],1)
			#x[1]
		}else{
			#NA
			x[1]
		}
	}	
}

#s%>% group_by(g) %>% dplyr::summarise_each(funs(rep2),everything())
s%>% group_by(g) %>% dplyr::summarise_all(funs(rep2))


一行目〜4行目を削除して"y"だけ復活させる

 dplyr::select(s,-(1:4),"y")[1:10,]

応用編
最初100行に限定して、COL_KEY列でグループわけして、代表値を取得,1列目〜25列目を削除するが、その削除期間にあるCOL_SELECT列だけを復活させる。さらにクラス数あたりの数が小さい列が削除.また、クラス数が多すぎる列も削除.一行でも欠損がある行は削除.

 fact_no_check<-function(x){
	if(class(x)=="integer" | class(x)=="numeric"){
		#median(x,na.rm=T)
		TRUE	
	}else{	
		v<-x[!is.na(x)]
		if(length(v)!=0){
			a<-FALSE
			if(length(unique(v))<=30){
				a<-TRUE

			}
			b<-FALSE
			if( length(which(table(v)!=0))>=2){
				b<-TRUE

			}
			a&b

		}else{
			#NA
			FALSE
		}
	}

 }	

  tmp2<-q_tmp[1:100,] %>% dplyr::group_by(COL_KEY) %>% summarise_all(funs(rep2)) %>% dplyr::select(-(1:25),COL_SELECT) %>% select_if(function(x){all(!is.na(x))}) %>% select_if(fact_no_check)