Note@Getting and Cleaning Data

课程网址看这里

20140603

做了quiz1。

  • quiz1中需要需要xlsx等库,使用install.package()来下载,之后用library()来加载。
  • 载入rJava出错参考这个连接解决。
  • 处理xml需要用到xmlParser(记得设置useInternalNodes为TRUE),之后的提取数据用xpathSApply,具体用法参考课件和文档。
  • data.table的处理能力确实强大,而且很精简。比如DT[,mean(pwgtp15),by=SEX]这样就是根据SEX分组,然后计算pwgtp15这个column的均值了。

20140606

做了quiz2.没有看视频,也不一定是按照课件上的方式来做的,选择了最快完成的方式来做。

  1. 直接用浏览器打开https://api.github.com/users/jtleek/repos,然后Ctrl+F搜索"data sharing”,然后找”created_at”的那一行。
  2. 根据学的数据库知识可以盲选,最后还是用题目提供的方法验证了一下
  3. 同上题,可以盲选。
  4. url()readLines(),之后nchar(lines[c(10, 20, 30, 100)])
  5. file()readLines(),之后sum(as.numeric(substr(lines[5:length(lines)], 29, 32)))

20140608

做了quiz3.

  1. which(dt$ACR==3 & dt$AGS==6),对subtitle进行逻辑操作,然后which
  2. 对图片进行download.file()要设置mode='wb'(因为图片是二进制文件),然后用readJPEG进行读取,之后quantile进行统计即可。
  3. 这题卡了很久,主要还是操作上不熟悉
    • 首先第一个csv的处理,readcsv时候记得要设置StringsAsFactor=F,因为后面处理GDP时候需要用到原始的字符串,用dt1[5:194]提取出有意义的190行数据
    • 之后merge两个表格,用dt3<-merge(dt1, dt2, by.x="X", by.y="CountryCode")
    • 然后就是根据GDP排序,即X.3这个列,最后用的是dt4=dt3[order(as.numeric(gsub("([, ])", "", dt3$X.3))),]这个复杂的命令。于是GDP的形式是形如“ 123.456 “的不规则字串,所以as.numeric之前需要处理一下,这里我的方法比较暴力,直接是gsub("([, ])", "", dt3$X.3),也就是直接将空格和逗号替换成空串,这样“ 123.456 ”换成“123456”就可以用as.numeric来转换了
  4. tapply(as.numeric(dt3$Gross.domestic.product.2012), dt3$Income.Group, mean),用到了tapply。
  5. sum(as.numeric(split(dt3$Gross.domestic.product.2012, dt3$Income.Group)[["Lower middle income"]]) <= 38)又一个复杂命令。。大概是先用split根据income将GPA分开,然后转成数字,之后统计小于38的个数。

20140609

做quiz4.

  1. strsplit(names(dt), 'wgtp')[123]即可。
  2. 这个是quiz3的3题的数据集,操作第三题中也需要做,而且比这里更复杂。(这门课的设置略微不科学。。。)
    • read.csv时候加上stringsAsFactor=F,之后mean(as.numeric(gsub('([ ,])', '', dt2$X.3[5:194])))
    • 另外一个可行的做法是read.csv时候再加上strip.white,那么gsub时候只需要处理逗号即可。
    • 去字符串两边空格的方法也知道了,是stringr库里面的str_trim(竟然还要导入库)
  3. dt2$X.2[grep('^United', dt2$X.2)],当是复习了下正则表达式。
  4. 跟quiz3第三题的数据一样,用同样的方法merge数据后,sum(substr(dt3$Special.Notes,18,21)=="June")这样就可以得到结果。
  5. 一个关于股票的问题。。。R真是什么包都有。
    • nrow(amzn['2012'])
    • weekdays(index(amzn['2012']))=='星期一'

20140624

今天做Course Project的review,顺便也整理下自己的不足。
review的4份代码:
https://github.com/voegelas/datasciencecoursera/blob/master/getting-and-cleaning-data/course-project/run_analysis.R
https://github.com/AsiaLu/GettingAndCleaningDataProject/blob/master/run_analysis.R
https://github.com/egrossman/DataCleaningProject/blob/master/run_analysis.R
https://github.com/defenderb/CleaningDataCP/blob/master/run_analysis.R
自己的代码:
https://github.com/zhangliliang/project_for_getdata_coursera/blob/master/run_analysis.R

不足:

  1. 题意理解错了,最后tidydata的输出的要求是:“Creates a second, independent tidy data set with the average of each variable for each activity and each subject. ”,而我只针对了每个activity进行输出。(所以正确的data应该是180行,而不是我的6行)
  2. 对比起别人的代码,我的代码写得比较ugly。具体看下面的收获的总结。

收获:
如何实现“Creates a second, independent tidy data set with the average of each variable for each activity and each subject.”?
ugly的做法是(也就是我的做法):

1
2
3
4
5
6
7
8
9
10
simple=data.frame();
parts = split(total[2:67], total$activity);
for (i in c(1:66)){
for (j in c(1:length(parts))){
simple[j, i] = mean(parts[[j]][,i]);
}
}
colnames(simple) = features[cols, 2];
simple=cbind(names(parts), simple);
names(simple)[1] = "acitivity";

漂亮的做法是用melt和dcast:

1
2
dataMelt <- melt(data, id=c("activity", "subject"))
tidyData <- dcast(dataMelt, subject + activity ~ variable, mean)

后来才发现,melt和dcast的应用都是如此广泛:
[转载] R语言进阶之:数据整形(reshape)
探索R包reshape2:揉数据的最佳伴侣

简单来说:

  • melt的作用是拉成一个长的数据框。
    比如上面data原来是10299*68的,根据activity和subject拉开后,会变成679734*4.(其中679734=10299*(68-2),4=2+1variable+1value)
  • dcast是将melt之后的数据“揉”成另外一个想要的格式。
    比如上面对dataMelt,实际上是做了“根据subject和activity进行归并后,计算variable的均值”。
很久没有更新网站,发现多了不少评论和问题,无法一一回复,如果现在仍有问题请再次留言 :) 2016.03.29