R语言学习资源总结

Communication Concept & History Data Acquisition Machine Learning Onlinebook Program Tidyverse Website Visualization Basic Collection Common Plots Extension Map Modification Theory Communication Starting a Rmarkdown Blog with Blogdown + Hugo + Github (181110) 看了好几篇介绍用blogdown搭建博客的文章,只有这一篇文章介绍的方法让我成功了。 Adding GIF animations (190228; 190311) 介绍了在blogdown中添加动图和生成动图的方法。 Create Multiple Reports with RMarkdown (181129; 190311) 使用Rmarkdown批量生成报告的教程,测试有效,非常实用。 MANY REPORTS FROM 1 RMARKDOWN FILE (190311) 另一篇使用Rmarkdown批量生成报告的教程,没有实际测试,但应该没问题。 Happy collaboration with Rmd to docx (181110)

Continue reading

A.关于数据 B.数据探索 b1.番名 b2.季数 b3.集数 b4.年份 b5.季节 b6.来源 b7.类别 b8.制作公司 b9.评分及人数 extra 1.个人、豆瓣与MAL的对比 b0.声优 extra 2.声优关系网络 C.建模与评估 c1.清洗数据 c2.创建训练数据集和测试数据集 c3.朴素贝叶斯算法 c4.规则学习算法 D.局限与展望 花费许多时间学到的东西自然是要用一用的,如果工作中用不到的话,那就用来为生活增添些许乐趣吧。 看番多年,难免遇到烂番,既浪费时间,又影响心情;另外,有些优秀的番剧,可能因为某些原因,与自己失之交臂。要是能在自己看过的番剧的基础上,建立一个模型,帮自己避免烂番,发掘好番,那真是再好不过了。于是我就把自己近年来看过的番剧整理了一下,收集了若干相关信息,做成了excel表格,作为建立模型的原材料。数据是手动整理的,花费的时间比我预计的多很多,但在整理的过程中,也引发了不少回忆,所以也算不上是浪费时间。 A.关于数据 数据就是我看番的记录,不全,但应该是足够用了。反应变量是我对某番剧的评分,从5分到10分,是离散数据,在这第一次尝试中,计划将其变为二元分类数据,即5分到7分为不推荐,8分到10分为推荐。预测变量有十来个,包括番剧的年代、类型、制作公司、声优和网站评分等信息,在第一次尝试中,计划把数据弄成稀疏矩阵,使用朴素贝叶斯算法和规则学习算法来进行分类。 在查看数据之前,先载入分析需要用到的包: library(tidyverse) library(readxl) library(here) library(ggthemes) library(corrplot) library(tidytext) library(widyr) library(igraph) library(ggraph) library(e1071) library(RWeka) library(gmodels) 然后导入数据,并进行初步的清洗: anime <- read_xlsx(here('content', 'post', 'data', 'anime_record.xlsx')) %>% mutate_all(str_remove_all, pattern = '\U00A0') %>% # 去掉不间断空格<U+00A0> select(-record_time) %>% mutate(studio = str_remove(studio, ',.*')) %>% mutate_at(vars(c('season_number', 'episode', 'year', 'rating', 'db_number', 'mal_number')), as.

Continue reading

书中的第二个例子是利用朴素贝叶斯算法判断垃圾短信。 首先载入需要用到的包: library(tidyverse) # 清洗数据 library(here) # 设置数据文件路径 library(tidytext) # 分词及创建稀疏矩阵 library(e1071) # 建模 library(gmodels) # 评估模型 在清洗数据的时候遇到一定的困难,因为书中是用tm包进行文本处理的,而我完全没有用过这个包(甚至也没有装这个包),所以看书中的代码就只能凭感觉脑补了。不过,还好,最后还是成功写出了tidyverse化的数据清洗代码,如下: sms <- read_csv(here('content', 'post', 'data', '02-sms_spam.csv')) %>% mutate(type = factor(type), row = row_number()) %>% unnest_tokens(word, text) %>% anti_join(stop_words) %>% filter(!str_detect(word, '\\d')) %>% cast_sparse(row, word) %>% as.matrix() %>% as_tibble() %>% select(which(colSums(.) > 4)) %>% bind_cols(read_csv(here('data', '02-sms_spam.csv')) %>% mutate(type = factor(type), row = row_number()) %>% unnest_tokens(word, text) %>% anti_join(stop_words) %>% filter(!str_detect(word, '\\d')) %>% select(-3) %>% distinct()) %>% mutate_if(is.

Continue reading

通过将《机器学习与R语言》一书中的代码tidyverse化,来学习这本书。 书中第一个例子是利用kNN算法来诊断乳腺癌。 首先载入需要用到的包: library(tidyverse) # 清洗数据 library(here) # 设置数据文件路径 library(knitr) # 呈现更好看的表格 library(kableExtra) # 同上 library(class) # 使用包中的knn()函数 library(gmodels) # 使用包中的CrossTable()函数 然后导入数据并清洗: wbcd <- read_csv(here('content', 'post', 'data', '01-wisc_bc_data.csv')) %>% select(-id) %>% mutate(diagnosis = factor(diagnosis, levels = c('B', 'M'), labels = c('Benign', 'Malignant'))) %>% mutate_if(is.numeric, ~ (.x - min(.x)) / (max(.x) - min(.x))) 首先使用here函数找到数据文件的路径,然后使用read_csv函数将其读入R中;随后通过select函数将id变量去掉;然后利用mutate函数将diagnosis变量改为因子型;最后利用mutate_if函数,将所有数值型的变量进行min-max标准化,这里用到了公式化的匿名函数,可以使代码更为简练。此时的数据是这样的: wbcd %>% head() %>% kable() %>% kable_styling(bootstrap_options = "striped", font_size = 12) %>% scroll_box(width = "100%") diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean compactness_mean concavity_mean concave points_mean symmetry_mean fractal_dimension_mean radius_se texture_se perimeter_se area_se smoothness_se compactness_se concavity_se concave points_se symmetry_se fractal_dimension_se radius_worst texture_worst perimeter_worst area_worst smoothness_worst compactness_worst concavity_worst concave points_worst symmetry_worst fractal_dimension_worst Malignant 0.

Continue reading

人对事物的认识大概可以分为三个层次,从“未知的未知”到“已知的未知”再到“已知的已知”。如果确实是这样的话,那学习就可以分为两种,一种是把“未知的未知”变为“已知的未知”,如了解到这个世界上存在一种叫做“负数”的东西,但不知道它究竟指什么;另一种是把“已知的未知”变为“已知的已知”,如通过进一步的了解,获知“负数”的确切意义。德尔菲的神谕认为没有人比苏格拉底更聪明,其看重的可能并不在于苏格拉底是否比其他所有人拥有更多“已知的已知”,而是看到他比其他人拥有更多“已知的未知”。我不知道两种学习中哪一种更为重要,但我觉得,在大多数情况下,前一种学习都是后一种学习的先决条件。人的时间是有限的,没法把所有的知识都掌握,所以比较好的学习思路可能是先去获取足够多的“已知的未知”,再决定把哪些“已知的未知”转变为“已知的已知”。 我接触R已经三年多了,但真正开始学习R,也就一年多的样子。我对R本身其实没有多大的兴趣,但当我把tidyverse变为“已知的未知”时,才对这门语言产生了热情。翻开哲学的入门书,很有可能会发现最开始的章节是以苏格拉底来划分的,如类似“前苏格拉底时代的哲学家们”的说法。在这里,我也想用tidyverse这个词来对我的笔记章节进行划分(当然,tidyverse对应的哲学家更有可能是笛卡尔),具体来说,包括tidyverse之前,用来介绍R的一些基本知识;tidyverse之内,用来介绍tidyverse核心包的使用方法;tidyverse之上,用来介绍建立在tidyverse核心包基础上的一些实用的包;tidyverse之外,用来介绍与tidyverse无关,但很有用的一些包。当然,这些内容中的很大一部分对我来说还是“已知的未知”。 想弄这么个东西,目的主要有两个:一方面,把自己会的东西以教程的形式写出来,能让自己把“已知的已知”掌握得更牢固;另一方面,也能督促自己不断地去学习新知识,探索“未知的未知”,转化“已知的未知”。因此,内容方面,就包括我目前会的,和我将来想学的,具体内容可以看后面暂定的大纲。另外,我也给自己设定了几个要求: 术语尽量给出参考资料和对应的英文,不知道该如何翻译的直接用英文,符号给出对应的英文及其读音; 尽量保证所有的内容都能跟上R本体和所涉及的包的更新; 暂定的提纲如下: tidyverse之前 R的介绍及安装 R的基本概念及操作 R中的条件与循环 tidyveRse之内 使用readr导入数据 使用rvest获取网络数据 dbplyr与数据库 dplyr包常用操作及管道操作符 tidyr包常用操作及tidy data stringr包常用操作及正则表达式 forcats常用操作 lubridate常用操作 purrr包探索 组合使用 tidyverse代码风格 ggplot2基本统计图的绘制 ggplot2统计图的调整 ggplot2统计图的美化 tidyverse之上 使用tidytext进行文本分析 使用ggvis绘制交互统计图 使用gganimate绘制动态统计图 tidyverse之外 使用rmarkdown撰写报告 使用blogdown搭建博客 使用shiny制作网络应用

Continue reading

R的基本概念和操作

R的基本操作 a.计算 b.逻辑运算 c.赋值 R的基本概念 a.数据结构 数据探索 b.函数 c.包 190424 R的基本操作 a.计算 R可以作为计算器使用,+、-、*、/、^分别代表加减乘除和乘方: 2 ^ 2 / 2 - (2 * 2 + 2) ## [1] -4 %%求余数,%/%求商: 5 %% 2 ## [1] 1 5 %/% 2 ## [1] 2 b.逻辑运算 ==、!=、>、>=、<、<=分别用来判断相等、不等、大于、大于等于、小于、小于等于的关系,符合逻辑返回TRUE,反之返回FALSE。对于部分字符(英文字母和汉字),似乎是字母顺序排在后面的更大;对于字符型数值,似乎与其数值型数值相等;另外,逻辑型数值中,TRUE等于1,而FALSE等于0: TRUE == 1 ## [1] TRUE FALSE == 0 ## [1] TRUE '白马' != '马' ## [1] TRUE 1 == '1' ## [1] TRUE 'x' < 'y' ## [1] TRUE '一' > '二' ## [1] TRUE c.

Continue reading

11年-19年读书记录分析

大概在10年前后,镇上给村里弄了个农村书屋,其他办公室都没地方,就把书连书柜都放我办公室里了。当时统计了下,一共有1500多本书,后来又给了一批,最终达到1800多本。这些书中的大部分质量和内容都很一般,但还是有几本好书的。反正工作也挺闲的,每天就靠看书打发点时间。时过境迁,工作已经换了几个,但看书的习惯还一直保持着。 我从12年开始记日记,所以从那一年起,哪段时间看了哪本书都有记录。前几年把读书的记录整理过一次,但信息不全;今年过年前后,花了几天的时间又整理了一遍,添加了一些书籍相关的信息,就想着要不要也分析下(其实只是统计,并没有分析),算是对这些年自己读书的一个总结。有点遗憾的是,11年的记录只找到10月份到12月份的一部分,10月份以前的则完全没有记录,就没法统计进来了。 但在分析之前,还得说明一下,有些书我没有进行统计,这些书包括以下四种: 国产教材。比如为考研而看的《普通心理学》《心理学导论》之类的,但国外的教材,如《心理学与生活》等,不在此列。 技术类的书。如跟R相关的书,有实体的,也有在线的,都没有被统计进来。 电子书。不论是在手机上,kindle上,还是在更早的汉王上看的电子书,都没有统计进来。在看书这方面,我还是比较传统的,现在基本上只看实体书。 太low的书。如,有套书名叫《卑鄙的圣人:曹操》,老爹看见了,非要买一套,当时只出了5本,就都买了下来。我是家里有的书就要看完的(大概就是看完这套书后改了这个“毛病”),就硬着头皮把这几本书看了一遍。听说这套书让作者赚了一百多万的版税,但这也无法掩盖作者文笔一般、词汇匮乏的事实。印象最深的是,曹操笑起来是“噗嗤”,袁绍笑起来也“噗嗤”,连曹操的老子曹嵩笑起来也“噗嗤”,这到底是一群大老爷们,还是一群小丫头片子啊(当然,用在曹嵩身上也许是合适的)?总之,这类书就不进行统计了。 去掉以上四类书之后,剩下的书(共计465本次),就是要进行分析的了。 首先还是载入分析需要用到的包: library(tidyverse) library(readxl) library(knitr) 然后把数据导入并进行清洗。由于数据已经在excel里整理好了,所以也没啥好清洗的,只是对每本书的字数进行了校正: book <- read_xlsx('读书记录.xlsx') %>% select(year = 2, name = 4, publisher = 6, author = 7, country = 8, dynasty = 9, classification = 10, language = 11, price = 12, page = 13, words = 14, manner = 15) %>% mutate(words = case_when(language %in% c('古汉', '英汉') ~ words*1.3, language %in% c('古语', '英语') ~ words*2, TRUE ~ words), words = ifelse(manner == '书内', words*.

Continue reading

Author's picture

孟祥良

R语言爱好者, 心理学专业硕士 & FGO休闲玩家