R in Action 学习笔记
R in Action 开一个学习进度笔记,随时更新; p96 代码清单5-6 逻辑已经清楚 在步骤6 name<-strsplit((roster$Student)," ") 显示:非字符参数 出错原因: data.frame(...stringAsFactors=F) 应为data.frame(...stringsAsFactors=F) data.frame(...,row.names=NULL,check.rows=F,check.names=T, stringsAsFactors=default.stringsAsFactors()) 默认stringsAsFactors=T,把字符串转成因子;
p103 代码清单5-8 逻辑已经清楚 mystats<-function(x,parametric=TRUE,print=FALSE) #这个自定义函数接收一个对象及两个逻辑值 用文字解释就是:定义一个函数mystats,一个参数叫parametric,默认值为TRUE;另一个函数叫print,默认值为FALSE; if(parametric)即:在parametric=TRUE的条件下, if(parametric&print)即:在parametric=TRUE and print=FALSE(看到有说print=T但原函数已设定默认值为F,故此处存疑)的条件下
P118 代码清单6-6 "breaks=12":建议的分组组数,但R不一定会用,所以也不是最终结果 明确组数可以: bins<-seq(1,4,by=1) hist(x,breaks=bins) 参考:https://zhidao.baidu.com/question/1511432045281064980 "rug(jitter(mtcars$mpg))”:不理解rug函数和jitter函数的意思 rug: 是在坐标轴上标出元素出现的频数。出现一次,就会画一个小竖杠。从rug的疏密可以看出变量是什么地方出现的次数多,什么地方出现的次数少。 参考来源:http://bbs.pinggu.org/thread-3250365-1-1.html jitter: "比如有一组数据(10, 11, 12, 13, 15, 16, 16, 16, 16, 16, 16, 16, 16, 20) 其实rug就是在x轴上把对应的值描出来 如果有区间[10, 15), [15, 20) 画出来的话第一个区间会有4个点 第二个区间只有3个点 (这是因为都是16, 点100次看起来还是一个点..) 所以就要用jitter() 就是把16做一些"震动" 把 (16, 16, 16, 16)变成类似(15.99, 15.98, 16.01, 16,02)这样你就可以看到16附近有很多点了(因为不在同一点不再重合),比较客观的反应数据的密度啦" 参考来源:https://www.zhihu.com/question/33436881
结合P119 rug(jitter(mtcars$mpag,amount=0.01)) > rep(0, 7) [1] 0 0 0 0 0 0 0 > jitter(rep(0,7)) [1] -0.002448290 0.019793342 0.004345335 0.000578887 -0.019764075 [6] 0.019695490 0.017059758
> jitter(rep(0,7),amount=0.01) [1] -0.006114656 0.008213079 0.001553065 0.008997730 0.000625607 [6] -0.008319048 0.008198304
对轴须图的理解: 一般和密度曲线结合用,可以更好的帮助了解原始数据的信息(位置)
20170103-05 第七章 代码清单7-2 na.omit()移除所有含有缺失值的观测,na.omit()可以删除所有含有缺失数据的行; p75 na.rm=T 可以在计算之前移除缺失值并使用剩余值进行计算: x<-c(1,2,NA,3) y<-sum(x,na.rm=T) y [1] 6 is.na() #检测函数是否为缺失值,返回值为TRUE 或者 FALSE x<-x[!is.na(x)] #忽略向量中的缺省值 vector矢量:并不带有维度dim which(is.na(x)=T) #可以得到x向量中确为NA值的所在下标 x<-c(2:10) x [1]2 3 4 5 6 7 8 9 10 x<5 T T T F F F F F F x[x<5]<-NA NA NA NA 5 6 7 8 9 10 参考:http://f.dataguru.cn/thread-4402-1-1.html
代码清单7-7 在上一版的书中是这样的 vars <- c("mpg", "hp", "wt") dstats <- function(x)(c(mean=mean(x), sd=sd(x))) by(mtcars[vars], mtcars$am, dstats) 会报错: Error in is.data.frame(x) : (串列)对象不能强制改变成'double'种类 此外: Warning message: In mean.default(x) : 参数不是数值也不是逻辑值:回覆NA 搜了一堆网页这么解释: "因为mean()的参数必须是numeric或者logical,而书上传给dstats()的是以mtcars$am分组的mtcars[vars],是一个dataframe,所以报错。对dataframe求各列均值需要用sapply()函数" 参考网页:http://cos.name/cn/topic/155859/ “附带这个例子: > dstats <- function(x)(c(mean=mean(x), sd=sd(x))) > by(mtcars$mpg, mtcars$am, dstats) mtcars$am: 0 mean sd 17.147368 3.833966 ------------------------------------------------------------------------- mtcars$am: 1 mean sd 24.392308 6.166504 #假如传递的只是一列数据比如,就不会出错了。因为传递给dstats()的是一列数据,R会利用降维的思想,变成numeric类型。” 可以改成:dstats <- function(x)(c(mean=sapply(x,mean),sd=sapply(x,sd)); 依然存在的疑问: a<-data.frame(x1=1:3,x2=4:6) a x1 x2 1 1 4 2 2 5 3 3 6 mean(a) [1] NA Warning message: In mean.default(a) : 参数不是数值也不是逻辑值:回覆NA 但是 > class(a[1,1]) [1] "integer" 另外: > colMeans(a) x1 x2 2 4 > rowMeans(a) [1] 2 3 4 matrix > b<-matrix(1:6,2) > b [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > mean(b) [1] 3.5 > class(b[1,1]) [1] "integer" matrix与dataframe的区别:前者列必须相同,后者列可以是不同的数据类型 mean()可以计算矩阵b,但是不能计算数据框a,可能原因: > is.numeric(b) [1] TRUE > is.numeric(a) [1] FALSE
清单7-11 其中ftable()函数存疑,看到网上一个很好的示例,记录下来: >x<-mtcars[c("cyl","am","gear")] > table(x) >ftable(x) 在R gui中敲一遍,能很清楚看到table()和ftable()的差异