自用R语言脚本备忘


转岗了,不用js了,开始用R了。。。下面是常用的脚本,做个备忘。。。




library(ggplot2)
library(scales)
library(grid)


#require(matlab)


csv = function(file, target="clipboard", key="key", value="value"){
    
    msg = ""
    
    switch(target,
        "clipboard"=msg<-"clipboard",
        "file"=msg<-paste(file, "csv", sep=".")
    )


    print(paste("start convert", msg, "at", as.POSIXlt(Sys.time())))    
       
    data = read.csv(paste(file, "csv", sep="."))


    dfrm = data.frame()
    
    inteval = which(is.na(data[[value]]))[1]
   
    kIndex = 0
    vIndex = 0
    
    for(i in data[[key]]){
    v = c()
    if(i != ""){
            kIndex = kIndex + 1
    vIndex = vIndex + 1
      v = c(v, i)
     
            for(j in data[[value]]){
    if(vIndex < inteval * kIndex){
    v = c(v, data[[value]][vIndex])
    vIndex = vIndex + 1
    }
    }
         if(kIndex == 1){
         dfrm = data.frame(v)
         }else{
         dfrm = data.frame(dfrm, v)
         }
        }
    }
    
    #write.table(dfrm, file=paste(file, paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = FALSE)
    #clipboard(dfrm)


    switch(target,
        "clipboard"=(function(){
            clipboard(dfrm)    
        })(),
        "file"=(function(){
            write.table(dfrm, file=paste(file, paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = FALSE)                       
        })()
    )


    print(paste("finish convert", msg, "at",as.POSIXlt(Sys.time())))
}


purge = function(data.file, cond.file="cond"){
    
    data = read.csv(paste(data.file, "csv", sep="."))
    cond = read.csv(paste(cond.file, "csv", sep="."))
       
    cond.key = as.vector((subset(cond["key"], key != ""))[["key"]])
    cond.value = as.vector((subset(cond["value"], value != ""))[["value"]])
    cond.remove = as.vector((subset(cond["remove"], remove != ""))[["remove"]])
    
    i = 1
    command = "data.frame("
    while(i <= length(data)){
        if(i < length(data)){
            command = paste(command, colnames(data)[i], "=NA,", sep="")
        }else{
            command = paste(command, colnames(data)[i], "=NA", ")", sep="")
        }
        
        i = i + 1
    }
    
    emprow = eval(parse(text=command))


    i = 1
    rearr = ""
    datatmp = ""
    
    while(i <= length(cond.key)){
        
        j = 1
        while(j <= length(cond.value)){
            
            if(i == 1){
                tmp = subset(data, subset=(data[cond.key[i]] == cond.value[j]))
            }else{
                tmp = subset(datatmp, subset=(datatmp[cond.key[i]] == cond.value[j]))
            }
            
            if(j == 1){
                rearr = tmp
                rearr = rbind(rearr, emprow)
            }else{
                rearr = rbind(rearr, tmp)


                rearr = rbind(rearr, emprow)
            }


            j = j + 1
        }
        
        datatmp = rearr


        i = i + 1
    }
    
    #print(rearr)


    if(typeof(cond.remove) != "logical"){
        
        i = 1
        rIndex = c()
        while(i <= length(data)){
            j = 1
            while(j <= length(cond.remove)){
                if(colnames(data)[i] == cond.remove[j]){
                    rIndex = c(rIndex, 0 - i)            
                }
                j = j + 1
            }
            i = i + 1
        }


        clipboard(subset(rearr, select=rIndex), col.names=TRUE)
    }else{
        clipboard(rearr, col.names=TRUE)
    }
}


test = function(){
    df=read.csv(paste("dict", "csv", sep=".")) 
    print(df[[1,2]])
}


join=function(key.file="sumup.cond"){
    df=read.csv(paste(key.file, "csv", sep="."))
    col=colnames(df)
    #print(col)


    i=1
    df1=data.frame()
    while(i<=length(col)){
        command=paste("subset((subset(df,select=",col[[i]],")),(subset(df,select=",col[[i]],"))!=\"\")",sep="")
        tmp=eval(parse(text=command))
        #print(tmp)
        if(i==1){
            df1=tmp
        }else{
            df1=merge(df1,tmp)
        }
        i=i+1
    }


    #print(df1)
    i=1
    list=list()
    while(i<=length(df1[[1]])){
        j=1
        vec=c()
        while(j<=length(df1)){
            vec=c(vec,as.character(df1[[j]][[i]]))
            #print(vec)
            j=j+1
        }
        list[[i]]=vec
        i=i+1
    }


    #print(list)


    return(list)
}


vfromk = function(key.file="key", value.file="value",key.col.name){
    dfk=read.csv(paste(key.file, "csv", sep="."))
    dfv=read.csv(paste(value.file, "csv", sep="."))
    dfr=data.frame()
    #print(length(dfv[[key.col.name]]))
      
    i=1
    while(i<=length(dfk[[key.col.name]])){
        
        j=1
        while(j<=length(dfv[[key.col.name]])){
            if(as.character(dfk[[key.col.name]][[i]])==as.character(dfv[[key.col.name]][[j]])){
                
                dfr=rbind(dfr,subset(dfv, subset=(as.character(dfv[[key.col.name]])==as.character(dfv[[key.col.name]][[j]]))))
                #print(as.character(dfv[[key.col.name]]))
                break
            }
            j=j+1
        }


        i=i+1
    }


    #print(dfr)
    write.table(dfr, file=paste("vfromk", paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = TRUE)
    
    print(paste("output file is ", paste("vfromk", paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=""))
}


bdict = function(data.file,dict.file="dict",b.col.name){
    df=read.csv(paste(data.file, "csv", sep="."))
    dfd=read.csv(paste(dict.file, "csv", sep="."))
    dfr=data.frame()


    i=1
    while(i<=length(dfd[[b.col.name]])){
        
        j=1
        while(j<=length(df[[b.col.name]])){
            #print(as.character(dfd[[b.col.name]][[i]]))
            if(as.character(dfd[[b.col.name]][[i]])==as.character(df[[b.col.name]][[j]])){
                #print(subset(dfd,sebset=(as.character(dfd[[b.col.name]])=="北京"))) #as.character(df[[b.col.name]][[j]])
                #break
                tmp0=subset(df,subset=(as.character(df[[b.col.name]])==as.character(df[[b.col.name]][[j]])))
                
                k=1
                tmp1=data.frame()
                while(k<=length(tmp0[[b.col.name]])){
                    tmp1=rbind(tmp1,subset(dfd,subset=(as.character(dfd[[b.col.name]])==as.character(dfd[[b.col.name]][[i]]))))
                    k=k+1
                }
                dfr=rbind(dfr,unique(merge(tmp0,tmp1)))
                break
            }


            j=j+1
        }


        i=i+1
    }


    #print(dfr)
    write.table(dfr, file=paste("bdict", paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = TRUE)
    
    print(paste("output file is ", paste("bdict", paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=""))
}


sumupall=function(data.file,key.file="sumup.cond"){
    dfr=data.frame()


    dfk=read.csv(paste(key.file, "csv", sep="."))
    key=colnames(dfk)


    value=join(key.file)


    i=1
    
    while(i<=length(value)){
        tmp=sumup(data.file,key,value[[i]])
        if(i==1){
            dfr=tmp
        }else{
            dfr=rbind(dfr,tmp)
        }
        i=i+1
    }


    #print(dfr)
    write.table(dfr, file=paste("sumpupall", paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = TRUE)
    
    print(paste("output file is ", paste("sumupall", paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=""))
}


sumup=function(data.file,key,value){
    df=read.csv(paste(data.file, "csv", sep="."))
    dfr=data.frame()
    
    #print(key)
        
    i=1
    while(i<=length(key)){
        df=subset(df,subset=(as.character(df[[key[[i]]]]) == as.character(value[[i]])))
        #print(df)
        i=i+1
    }


    i=1
    first=TRUE
    tmp0=data.frame()
    while(i<=length(df)){
        if(colnames(df)[[i]]=="注册月份"){
            tmp0=dfbc(colnames(df)[[i]],df[[colnames(df)[[i]]]][[1]])
            
        }else{
        
            if(is.numeric(df[[i]])==TRUE){
                tmp1=dfbc(colnames(df)[[i]],as.vector(colSums(df[i]))[[1]])
                if(first==TRUE){
                    dfr=tmp1
                    first=FALSE
                }else{
                    dfr=cbind(dfr, tmp1)
                }
            }


        }
        i=i+1
    }
    dfr=cbind(tmp0,dfr)
    #print(dfr)


    return(dfr)
}


#data frame by command
dfbc=function(col.name,value){
    command=paste("data.frame(",col.name,"=",value,")",sep="")
    tmp=eval(parse(text=command))


    return(tmp)
}


#sumup for site data
sumupforsite=function(data.file, start, end, breaks="1 month", col.name){
    df=read.csv(paste(data.file, "csv", sep="."))
    df=subset(df, subset=(as.character(df[["城市"]]) != "整站"))
    
    period=seq(as.Date(start, format="%Y-%m-%d"), as.Date(end, format="%Y-%m-%d"), by=breaks)
     
    i=1
    m=unique(subset(df,select="日期"))[[1]]
    df0=as.data.frame(m)
    names(df0)[names(df0) == "m"] = "日期"
    while(i<=length(col.name)){
        j=1
        df1=data.frame()
        per=FALSE
        while(j<=length(period)){
               
            command=paste('subset(df, subset=((paste(as.character(df[["日期"]]), "-01", sep="") == as.character(period[[j]]))), select=', col.name[[i]], ')',sep='')
            tmp=eval(parse(text=command))
            
            #att: make sure that the first value of a percentage column should be added on "%", especially checking for 0
            if(j==1){


                per=isperstr(as.character(tmp[[1]][[1]])) == TRUE
            }


            #print(tmp[[1]][[1]])            
            #print(isperstr(as.character(tmp[[1]][[1]])) == TRUE)
            if(per == TRUE){
                #tmp1=lapply(as.data.frame(per2num(tmp)), mean)
                p=num2per(lapply(as.data.frame(per2num(tmp)), mean))
                tmp1=as.data.frame(p)
                #print(tmp1)
                #return()
                names(tmp1)[names(tmp1) == "p"] = col.name[[i]]
                df1=rbind(df1,tmp1)
            }else{               
                df1=rbind(df1,lapply(tmp, sum))
            }
            
            j=j+1
        }
        df0=cbind(df0,df1)
        #print(df0)
        i=i+1
    }
    #print(df0)


    write.table(df0, file=paste(data.file, paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = TRUE)
    
    print(paste("output file is ", paste(data.file, paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=""))


}


#isperstr: is percentage string
isperstr = function(str){
    pattern = "^\\d+\\.{0,1}\\d{0,2}\\%$"
    return(regexpr(pattern, as.character(str)) == TRUE)
}


filter = function(data.file, key.col.name="分类", key.name, value.col.name){
    df = read.csv(paste(data.file, "csv", sep="."))
    
    i = 1


    df1 = data.frame()


    while(i<=length(key.name)){
        command = paste("subset(df, select=c(", key.name[[i]], "))", sep="") 
        tmp = eval(parse(text=command))
        #print(length(tmp[[1]]))
        
        j = 1
        tmp1 = c()
        while(j <= length(tmp[[1]])){
            tmp1 = c(tmp1, key.name[[i]])
            j = j + 1
        }
        tmp = cbind(tmp, tmp1)
         
        names(tmp)[names(tmp) == "tmp1"] = key.col.name
        names(tmp)[names(tmp) == key.name[[i]]] = value.col.name
        df1 = rbind(df1, tmp)
        i = i + 1
    }


    write.table(df1, file=paste(value.col.name, paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=",", row.names = FALSE, col.names = TRUE)
    
    print(paste("output file is ", paste(value.col.name, paste(as.POSIXlt(Sys.time()),"csv", sep="."), sep="@"), sep=""))
}


plot = function(data.file, cond.file="cond", cond.multi=FALSE, output.ext="jpg", y.label="comma", y.label.format=TRUE, graph.multi=FALSE, page.w=600, page.h=400, page.c=2){
    
    if(graph.multi==TRUE){
        #call jpeg() at first to make the pic as a device for print(plot) later
        page.r=ceiling(length(data.file)/page.c)
        jpeg(paste("multi.graph", paste(as.POSIXlt(Sys.time())), sep="@"), width=page.w*page.c, height=page.h*page.r)
        
        grid.newpage()
        pushViewport(viewport(layout = grid.layout(page.r, page.c)))


    }
    index =  1


    while(index <= length(data.file)){
        
        df = read.csv(paste(data.file[index], "csv", sep="."))


        if(cond.multi==FALSE){
            cond = read.csv(paste(cond.file, "csv", sep="."))
        }else{
            cond = read.csv(paste(cond.file,data.file[index],"csv", sep="."))
        }
        
        type = as.character(cond$type[1])
        start = as.character(cond$period[1])
        end = as.character(cond$period[2])
        breaks = as.character(cond$period[3])
        x = as.character(cond$x[1])
        colour = as.character(cond$colour[1])
        #title = as.character(cond$title[1])


        if(graph.multi==TRUE && cond.multi==FALSE){
            title = paste(data.file[index],as.character(cond$title[1]),sep=".")    
        }else{
            title = as.character(cond$title[1])
        }


        width = as.integer(cond$size[1])
        height = as.integer(cond$size[2])
        
        path = (paste("./", data.file[index], "@",title, sep=""))
        amt = length(levels(df[[colour]]))
        
        if(graph.multi==FALSE){
            if(direxist(path)){
                dirremove(path)
            }
            dir.create(path)
        }


        if(type == "date"){
            period = seq(as.Date(start, format="%Y-%m-%d"), as.Date(end, format="%Y-%m-%d"), by=breaks)
        }else if(type == "posix"){
            period =seq(as.POSIXlt(start, format="%H:%M:%S"), as.POSIXlt(end, format="%H:%M:%S"), by=breaks)    
        }
        
        i = 1
        
        while(i < amt){
            
            if(type == "date"){
                tmp = seq(as.Date(start, format="%Y-%m-%d"), as.Date(end, format="%Y-%m-%d"), by=breaks)
            }else if(type == "posix"){
                tmp =seq(as.POSIXlt(start, format="%H:%M:%S"), as.POSIXlt(end, format="%H:%M:%S"), by=breaks)    
            }
    
            period = c(period, tmp)
            
            i = i + 1 
        }
        
        df = cbind(df, period)
        
        names(df)[names(df) == "period"] = x


        i = 1
    
        ylen = firstempty(cond$y)
        
        while(i <= ylen){
            
            pattern = "^\\d+\\.{0,1}\\d{0,2}\\%$"
             
            if(regexpr(pattern, as.character(df[[as.character(cond$y[i])]][[1]])) == TRUE){
                k = 1
                per = c()
               
                while(k <= length(df[[as.character(cond$y[i])]])){
                    tmp = per2num(df[[as.character(cond$y[i])]][[k]])
                    per = c(per, tmp)
                    k = k + 1
                }


                command = paste("subset(df, select=c(-", cond$y[i], "))", sep="")
                df = eval(parse(text=command))
                
                df = cbind(df, per)
                
                names(df)[names(df) == "per"] = as.character(cond$y[i])
                
                y.label = "percent"
            }
                        
            #print(df)
            
            command = paste("ggplot(df, aes(x=", x, ", y=", cond$y[i], ", colour=", colour, "))", sep="")
            
            plot = eval(parse(text=command))
            
            plot = plot + 
            geom_line() +  
            geom_point(size = 4) 
            
            if(y.label == "comma"){
                plot = plot + scale_y_continuous(labels = comma)
            }
            else if(y.label == "percent"){
                plot = plot + scale_y_continuous(labels = percent)
            }
            if(type == "date"){
                if(y.label.format==TRUE){
                    plot = plot + scale_x_date(labels = date_format("%y-%m"), breaks = date_breaks(breaks))
                }else{
                    plot = plot + scale_x_date(labels = date_format(y.label.format), breaks = date_breaks(breaks))
                }
            }else if(type == "posix"){
                if(y.label.format==TRUE){
                    plot = plot + scale_x_datetime(labels = date_format("%H:%M"), breaks = date_breaks(breaks))
                }else{
                    plot = plot + scale_x_date(labels = date_format(y.label.format), breaks = date_breaks(breaks))
                }
            }
    
            plot = plot + ggtitle(paste(cond$y[i],"@",title)) + 
            theme(plot.title=element_text(vjust = -2.5)) 
            
            if(graph.multi==TRUE){
                if(index%%page.c==0){
                    print(plot, vp=vplayout(as.integer(index/page.c),page.c))    
                }else{
                    print(plot, vp=vplayout(as.integer(index/page.c)+1,index%%page.c)) 
                }
                
            }else{
                filename = paste(cond$y[i],"@",title,".", output.ext,sep="")


                ggsave(filename=filename, path=path, width=width, height=height, units="cm")
            
                print(paste(paste("finish saving", filename,"at"), as.POSIXlt(Sys.time())))
            }
            #print(plot)


            i = i + 1
        }


        index = index + 1
    } 
    #after all print(plot) the device should be closed
    dev.off()
    
    return("finish all")
}


#view port layout
vplayout=function(x, y){
    viewport(layout.pos.row = x, layout.pos.col = y)
}


clipboard = function(x, sep=",", row.names=FALSE, col.names=FALSE){
     con = pipe("xclip -selection clipboard -i", open="w")
     write.table(x, con, sep=sep, row.names=row.names, col.names=col.names)
     close(con)
}


num2per = function(num){
    #print(length(num[[1]]))
    if(length(num[[1]])==1){
        return(paste((round(as.numeric(num),digits=4) * 100),"%",sep=""))
    }else{
        per=c()
        for(x in num){
            per=c(per,paste((round(x,digits=4) * 100),"%",sep=""))  
        }
        return(per)
    }
}


per2num = function(per){
    #print(length(per[[1]]))
    if(length(per[[1]])==1){
        return(as.numeric(strsplit(as.character(per), "%")[[1]]) / 100)
    }else{
        i=1
        num=c()
        while(i<=length(per[[1]])){


            #print(length(per[[1]]))


            num=c(num,as.numeric(strsplit(as.character(per[[1]][[i]]), "%")[[1]]) / 100) 
            i=i+1
        }
        #print(nums)
        return(num)
    }       
}


firstempty = function(cell){
    i = 1
    while(i<length(cell)){
        
        if(cell[i] == ""){
            return(i - 1)
        }
        i = i + 1
    }
    return(i)
}(subset(df,select=战区))


direxist = function(path){
    
    if(is.na(file.info(path)$isdir) == TRUE){
        return(FALSE)
    }else{
        return(file.info(path)$isdir)
    }    
}


dirremove = function(path){
    
    i = 1
    fileamt = length(list.files(path))
    filename = list.files(path)
    while(i <= fileamt){
        file.remove(paste(path, "/", filename[i], sep=""))
        i = i + 1
    }


    file.remove(path)
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值