前言

继续对矩阵和向量做一些深入的和完成一些课题例子,做一些有选择的学习。

矩阵 课题 1

课题 1:矩阵内部存放着多个向量,现在来做一个多个向量去填充到一个矩阵内,然后对这个矩阵美化命名。

matrix <- function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 

学过其他语言都知道,NA 是在 R 语言里面有意义的,是占位的意思,需要后面填充。nrow 代表生成矩阵总行数。
dimnames 是用来给矩阵的行列 title 命名的,这个不是必须的,所以是 NULL。这个需要是一个 list
matrix 的第一个参数 data,demo 数据是可以用 min:max 去造一批数据。
如果要安装课题 1,需要根据编程思维把这个过程进行拆解:
1.设计 row 和 col 的 title,然后进行 list,这里涉及到这个 2 个对象如何转 list。
2.data 对多组的向量进行合并,涉及到如何合并 c
3.编写一个函数去实现矩阵。
4.生成后的矩阵写入 csv。
拿一个测试数据举个例子,行数据是关键数据,这里可以借代为模块名称,列数据是行数据的 Info 数据。

rowNames <- c("login","guild","activity","task")
colNames <- c("new bug","open bug","major bug","fixed bug")
renameList <-list(rowNames,colNames)

colNames 列数据 title 是代表阶段性(一个周期内)的 rowNames 的 Info 具体数值:
其中 new bug 为新增问题,open bug 问题在开启状态中未被处理的,major bug 重要的问题,借指优先级高的问题,fixed bug 是指修复后完成测试验证复查的 bug。
list 展开数据,是用 list(c1,c2) 的数据,继续造一批数据出来,这里有个技巧,因为 row title 写过 Python pd 的会知道最终会被隐藏掉的,所以需要在 colNames 里面加一列,类似数据库的主键,上面数据纠正后填写下面的。

rowNames <- c("login","guild","activity","task")
colNames <- c("module","new bug","open bug","major bug","fixed bug")
renameList  <-list(rowNames,colNames)
#下面向量的第一个位置就是上面新增module的
t1 = c("login",50,20,25,15)
t2 = c("guild",70,30,35,15)
t3 = c("activity",56,20,15,9)
t4 = c("task",100,30,35,27)

new bug 写入到 csv 里面时会按 new.bug,因为变量中间不能加空格,所以空格会被内部转换成.进行连接。
这批数据也就是喂给 matrix(data) 里面的,data 是通过 c() 合并数据的,再写个变量填充到 nrow 的位置上。

vdata <- c(t1,t2,t3,t4)
rowL <-length(vdata)/length(t1)   #因为做这块统计动态的每个向量的长度都是一样的。

向量合并,就是一个二维数组里面有多个一维数组,然后合并成一维数组。下面是多个向量的矩阵生成的函数

#生成多个向量矩阵
genByVectors <- function(v,rowLen){
    return(matrix(v,nrow=rowLen,byrow=TRUE,dimnames=renameList))
}
result <- genByVectors(vdata,rowL)
print(result)
#output打印结果(数字虽然填写的,可以忽略)
         module     new bug open bug major bug fixed bug
login    "login"    "50"    "20"     "25"      "15"     
guild    "guild"    "70"    "30"     "35"      "15"     
activity "activity" "56"    "20"     "15"      "9"      
task     "task"     "100"   "30"     "35"      "27"   

dimnames 传入的 list 对象是对原来默认的 row,col 的数字从 1,1 开始,改成上面的。

矩阵课题 2

课题 2:把矩阵的数据去写入 csv 文件,然后去读取文件中 open bug(开启状态未处理)大于 20 的 bug。
写入 csv,csv 不用特别去安装包,csv 的文件最后一行需要保留一个空行,要不会会出现警报

Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
incomplete final line found by readTableHeader on

虽然 R 是一门 DSL,但是开发严谨性来说,需要和写其他语言一样的。
编程思维:写入 csv 后,再读取需要判断文件是否存在和文件后缀是.csv

#后缀判断
suffixTo <- function(fileName,idx){
    return(strsplit(fileName,split='[.]')[[1]][idx])
}
tag <-  file.exists(csvName)&suffixTo(csvName,3)=="csv" #判断文件是否存在和文件后缀是.csv
print(tag)

idx 里面的数据是需要调式的。
写入 csv,然后查询出这个 csv 里面的内容,这个内容理论是需要和上面矩阵的 result 是一样的。
把上面的进行结合一下。

# 写入csv
writeCsv <- function(v,csvName,idx){
    write.csv(v,csvName, row.names = FALSE)
    if(file.exists(csvName) & suffixTo(csvName,idx)=="csv"){
        return(read.csv(csvName, encoding="UTF-8"))
    }
}
#这里的路径getwd()和case.csv拼接的,是相对路径。
csv <- writeCsv(result,"./case.csv",3)
print(csv)
print(csv==result)
#结果是一样的,每个位置会进行匹配,这里也看的出来R语言的强大。
     module new.bug open.bug major.bug fixed.bug
[1,]   TRUE    TRUE     TRUE      TRUE      TRUE
[2,]   TRUE    TRUE     TRUE      TRUE      TRUE
[3,]   TRUE    TRUE     TRUE      TRUE      TRUE
[4,]   TRUE    TRUE     TRUE      TRUE      TRUE

现在开始对 csv 按条件查询,可以做成分为二种的按条件找(按主键看某一行是否有),全表找对象
编程思维:按条件找,查询就需要有一个对象,主键(模块)就代表了某一行的数据。

#按模块找
querymodule <- function(v){
    if(is.data.frame(v)){
        return(subset(v,module=="login"))
    }
}
qcsv <- querymodule(csv)
print(qcsv)
#output:可以看上面打印的结果
  module new.bug open.bug major.bug fixed.bug
1  login      50       20        25        15

按全表去找,这里反馈了一个 R 语言特性,大于等于"20"也是可以正确查询出来,不用和其他语言一样进行转型。

#查询bug次数(这里查询的是open.bug)
queryBugNum <- function(v){
    if(is.data.frame(v)){
        return(subset(v,open.bug >"20"))
    }
}
qcsv <- queryBugNum(csv)
print(qcsv)
#output:
  module new.bug open.bug major.bug fixed.bug
2  guild      70       30        35        15
4   task     100       30        35        27

要增加其他条件,需要在 subset 第二个字段位置 & 其他条件,可以发现 subset 的语义和 mysql 里面的 where 是一样的。
后续第三个篇里面在谈谈 R 语言其他数据结构的操作,R 语言有不同的分析包是用来解决特别问题的,但是要把 R 语言脱离命令行去做出工程,只有代码才是硬道理。


↙↙↙阅读原文可查看相关链接,并与作者交流