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)