R数据科学(R for Data Science)

Part 2:数据处理


导入——>整理——>转换

------------------第7章 使用tibble实现简单数据框-------------------

#tibble一种简单数据框
vignette("tibble") #创建tibble
str(iris)
str(as_tibble(iris)) tibble(x=1:5,
y=1,
z=x^2+y)
#tribble(transposed tibble)转置tibble,对数据按行进行编码
tribble(~x,~y,~z,
#--/--/----
"a",2,3.6,
"b",1,8.5) #tibble与data.frame的比较
tibble(a=lubridate::now()+runif(1e3)*86400,
b=lubridate::today()+runif(1e3)*30,
c=1:1e3,
d=runif(1e3),
e=sample(letters,1e3,replace = T)) flights %>% print(n=10,width=Inf) #打印所有列
#flights %>% View() df <- tibble(x=runif(5),y=runif(5))
df$x
df[["x"]]
df[[1]] df %>% .$x #管道连用需要占位符
df %>% .[["x"]]
df %>% .[[1]] #转换
class(as.data.frame(tb))

---------------第8章 使用readr进行数据导入-------------------------------

read_csv() # ,
read_csv2() # ;
read_tsv() # \t
read_delim() # 任意分隔符
read_fwf() # 固定宽度:fwf_widths按宽度设置域,fwf_position按位置设置域
read_table() #固定宽度,空白符
read_log() #apache风格的日志文件 #csv文件是数据存储最常用的形式
read_csv("a,b,c
1,2,3
4,5,6") #提供创建行内csv文件 read_csv("test 1
test 2
x,y,z
1,2,3",skip=2) #skip跳过前两行 read_csv("#test 1
#test 2
x,y,z
1,2,3",comment="#") #跳过以#开头的行 read_csv("1,2,3\n4,5,6",col_names = F) #不将第一行视为列标题
read_csv("1,2,3\n4,5,6",col_names = c("x","y","z")) #自定义列名
read_csv("a,b,c\n1,2,.",na=".") #设定缺失值 #与基础包比较
#快;可生成tibble;易于重复 #解析向量
parse_logical(c("TRUE","FALSE","NA"))
parse_integer(c("1","2","3"))
parse_integer(c("1","2","."),na=".")
(x <- parse_integer(c("1","2","ad","3.4"))) #解析失败
problems(x) #解析失败很多时,获取完整的失败信息集合 #①数值
parse_double("1.23")
parse_double("1,23",locale=locale(decimal_mark = ",")) #分组符号只能设逗号和点?
parse_number("$1000")
parse_number("20%")
parse_number("it costs $123.45")
parse_number("$123,456,789") #②字符串
parse_character("el ni is a test")
parse_character("El Ni\xf1 is a test",locale=locale(encoding = "Latin1")) #③因子
parse_factor(c("apple","banana")) #④日期和时间
parse_datetime("2010-01-11T2010")
parse_datetime("20100111") parse_date("2010-10-10")
parse_date("01/02/15","%m/%d/%y") parse_time("01:10 am")
parse_time("20:10:01") #解析文件
#readr使用一种启发式过程来确定每一列的类型:先读取1000行,然后再用某种启发式算法来确定每列的类型
#parse_guess()猜测来解析列
#会有一些问题:如NA过多、前1000行较特殊等
#建议总是提供col_types参数
#PS:读个文件,太他妈麻烦了,放弃不看! #写入文件
write_csv()
write_tsv()
write_excel_csv()
write_rds()

---------------第9章 使用dplyr处理关系数据--------------------------

#即处理多个数据集:合并连接、筛选连接、集合操作
library(nycflights13)
flights
airlines
airports
planes
weather #键:连接每对数据集的变量;主键:该数据集观测的唯一标识;外键:另一数据集观测的唯一标识
#识别主键并验证
planes %>% count(tailnum) %>% filter(n>1) #检查没有重复 #有些数据没有明确的主键:变量组合也不能明确标识
flights %>% count(year,month,day,flight) %>% filter(n>1) #代理键:没有主键情况下创建的主键,mutate和row_number函数
#关系:一对一,一对多,多对一,多对多 #合并连接:
flights2 <- flights %>% select(year:day,hour,origin,dest,tailnum,carrier)
flights2
flights2 %>% select(-origin,-dest) %>%
left_join(airlines,by="carrier")
#等同于
flights2 %>% select(-origin,-dest) %>%
mutate(name=airlines$name[match(carrier,airlines$carrier)]) #合并方式:
inner_join(x,y) #merge(x,y)
left_join(x,y) #merge(x,y,all.x=T)
right_join(x,y) #merge(x,y,all.y=T)
full_join(x,y) #merge(x,y,all.x=T,all.y=T) #指定键(列)
left_join(flights2,weather) #默认by=NULL,连接两个表中所有变量
left_join(flights2,planes,by="tailnum") #指定公共变量
left_join(flights2,airports,c("dest"="faa")) #匹配两个表的dest列和faa列 #筛选连接
semi_join(x,y) #保留和y表匹配的所有x表观测值
anti_join(x,y) #丢弃................... top_dest <- flights %>% count(dest,sort = T) %>% head(10)
top_dest #最受欢迎的top10目的地
flights %>% filter(dest %in% top_dest$dest)
#等于
flights %>% semi_join(top_dest) flights %>% anti_join(planes,by="tailnum") %>% count(tailnum,sort = T) #集合操作:整行比较
intersect(x,y)
union(x,y)
setdiff(x,y)#x有,y没有

---------------第10章 使用stringr处理字符串---------------------

x <- c("\"","\\")
x
writeLines(x) #查看字符串原始内容 #字符串长度
str_length(c("a","r for data science",NA)) #字符串组合
str_c("x","y")
str_c("x","y",sep = ",") x <- c("abc",NA)
str_c("|-",x,"-|")
str_c("|-",str_replace_na(x),"-|")
#向量化
str_c("pre-",c("a","b","c"),"-suffix") #字符串取子集
x <- c("Apple","Banana","Pear")
str_sub(x,1,3)
str_sub(x,-3,-1)
str_sub("a",1,5) str_to_upper(x)
str_to_lower(x) #排序
str_sort(x)
str_order(x) #正则表达式匹配
str_view(x,"an")
str_view(x,".a.") #匹配换行符外的任意字符 #转义
dot <- "\\."
writeLines(dot)
str_view(c("abc","a.c","bef"),"a\\.c") x <- "a\\b"
writeLines(x)
str_view(x,"\\\\") #锚点
x <- c("apple","apple pie","banana","pear")
str_view(x,"^a")
str_view(x,"a$")
str_view(x,"apple")
str_view(x,"^apple$")
str_view(x,"\bapple\b") #\b匹配单词边界 error? #字符类
# \d:任意数字
# \s:任意空白字符(空格、制表符、换行符)
# [abc]:a或b或c
# [^abc]:除a/b/c外的任意字符 str_view(c("grey","gray"),"gr(e|a)y") #重复
x <- "this is a test: MDCCCCCCLXXXXIIIV"
str_view(x,"CC?") #? 0或1次
str_view(x,"CC+") #+ 1或多次
str_view(x,"CC*") #* 0或多次
str_view(x,"C[LX]+") str_view(x,"C{2}") #2次
str_view(x,"C{2,}") #至少2次
str_view(x,"C{2,4}") #2-4次
#默认贪婪匹配 #懒惰模式
str_view(x,"C{2,3}?")
str_view(x,"C[LX]+?") #分组与回溯引用
fruit
str_view(fruit,"(..)\\1",match = T) #相对于创建一个复杂的正则表达式,不如创建多个简单的正则表达式 #匹配检测
x <- c("apple","banana","pear")
str_detect(x,"e") #返回逻辑值
words
sum(str_detect(words,"^t")) #统计匹配个数
mean(str_detect(words,"[aeiou]$")) #元音字母结尾的单词的比例 #取元素
words[str_detect(words,"x$")]
str_subset(words,"x$") #数据框取元素
df <- tibble(word=words,i=seq_along(word))
df
df %>% filter(str_detect(words,"x$")) #返回匹配数量
str_count(x,"a")
mean(str_count(words,"[aeiou]")) #平均数目 df %>% mutate(vowels=str_count(word,"[aeiou]"),
consonants=str_count(word,"[^aeiou]")) str_count("abababa","aba") #匹配2次,不会重叠
str_view_all("abababa","aba")
#stringr的函数都是成对的:后缀加_all的用于全部匹配,没加的单个匹配 #提取匹配内容
stringr::sentences
length(sentences)
#想要从中找出所有含有颜色的句子
colors <- c("red","orange","yellow","green","blue","purple")
color_match <- str_c(colors,collapse = "|") #以|连接
has_color <- str_subset(sentences,color_match) #匹配的句子
matches <- str_extract(has_color,color_match) #匹配的元素,每个句子只提取第一个匹配
head(matches) more <- sentences[str_count(sentences,color_match)>1]
str_view_all(more,color_match)
str_extract(more,color_match)
str_extract_all(more,color_match) #提取多个匹配元素,返回列表
str_extract_all(more,color_match,simplify = T) #返回矩阵 #分组匹配
str_match() #替换匹配内容
x <- c("apple","banana","pear")
str_replace(x,"[aeiou]","-")
str_replace_all(x,"[aeiou]","-")
#同时多个替换
x <- c("1 hours","2 cars","3 people")
str_replace_all(x,c("1"="one","2"="two","3"="three")) #拆分
sentences %>% head(5) %>% str_split(" ") #返回列表
sentences %>% head(5) %>% str_split(" ",simplify = T) #返回矩阵
sentences %>% head(5) %>% str_split(" ",n=2,simplify = T) #只拆分2段 #定位匹配内容
str_locate(x,"rs$") #其他模式
str_view(fruit,"nana") #是以下函数的简写
str_view(fruit,regex("nana"))
str_view(fruit,regex("nana",ignore_case = T)) #忽略大小写
#regex其他参数:multiline=T/F, comments=T/F, dotall=T/F
#fixed函数
#coll函数
#boundar函数 #R基础函数妙用:
apropos("replace") #在环境中搜索可用的对象,不能想起函数名时用
dir(pattern="\\.Rmd$") #列出目录下所有文件

--------------第11章 使用forcats处理因子------------

factor()
levels() forcats::gss_cat #社会调查数据
gss_cat %>% count(race) #修改因子水平顺序和值
gss_cat %>% count(partyid)
gss_cat %>% mutate(partyid=fct_recode(partyid,
"new1"="No answer",
"new2"="Other party")) %>% count(partyid) #---------------第12章 使用lubridate处理日期和时间------------------------
library(lubridate)
today()
now()
#略

R数据科学-2的更多相关文章

  1. 学习《R数据科学》高清中文PDF+高清英文PDF+源代码

    学习R有不会的就查工具书<R数据科学>, 工具不是重点,创造价值才是目的.具体到数据科学,表现形式往往是提供解决方案或者做出某种决策.至于使用什么语言,采用什么工具,不本质.用 R 还是 ...

  2. R数据科学-3

    R数据科学(R for Data Science) Part 3:编程 转换--可视化--模型 --------------第13章 使用magrittr进行管道操作----------------- ...

  3. R数据科学-1

    R数据科学(R for Data Science) Part 1:探索 by: PJX for 查漏补缺 exercise: https://jrnold.github.io/r4ds-exercis ...

  4. 深入对比数据科学工具箱:Python和R之争

    建议:如果只是处理(小)数据的,用R.结果更可靠,速度可以接受,上手方便,多有现成的命令.程序可以用.要自己搞个算法.处理大数据.计算量大的,用python.开发效率高,一切尽在掌握. 概述 在真实的 ...

  5. 数据科学实战手册(R+Python)书中引用资料网址

    本文会持续将<数据科学实战手册(R+Python)>一书中的附带参考资料网址手打出来, 方便访问. 由于书中的参考资料网址太多, 这个文档将可能花费一段时间才能完成. 第一章 P7  Rs ...

  6. (数据科学学习手札07)R在数据框操作上方法的总结(初级篇)

    上篇我们了解了Python中pandas内封装的关于数据框的常用操作方法,而作为专为数据科学而生的一门语言,R在数据框的操作上则更为丰富精彩,本篇就R处理数据框的常用方法进行总结: 1.数据框的生成 ...

  7. R学习:《机器学习与数据科学基于R的统计学习方法》中文PDF+代码

    当前,机器学习和数据科学都是很重要和热门的相关学科,需要深入地研究学习才能精通. <机器学习与数据科学基于R的统计学习方法>试图指导读者掌握如何完成涉及机器学习的数据科学项目.为数据科学家 ...

  8. 机器学习与数据科学 基于R的统计学习方法(基础部分)

    1.1 机器学习的分类 监督学习:线性回归或逻辑回归, 非监督学习:是K-均值聚类, 即在数据点集中找出“聚类”. 另一种常用技术叫做主成分分析(PCA) , 用于降维, 算法的评估方法也不尽相同. ...

  9. [数据科学] 从text, json文件中提取数据

    文本文件是基本的文件类型,不管是csv, xls, json, 还是xml等等都可以按照文本文件的形式读取. #-*- coding: utf-8 -*- fpath = "data/tex ...

随机推荐

  1. spring security中动态更新用户的权限

    在程序的执行过程中,有时有这么一种需求,需要动态的更新某些角色的权限或某些人对应的权限,当前在线的用户拥有这个角色或拥有这个权限时,在不退出系统的情况下,需要动态的改变的他所拥有的权限. 需求:张三 ...

  2. 嵌入式STM32的GPIO口工作模式的介绍

    一.输入模式 1. 浮空输入 浮空输入模式下,上拉和下拉两个开关断开,高或低电平通过施密特触发器到达输入数据寄存器,CPU可以通过读取输入数据寄存器从而读取到外部输入的高低电平值. 2. 输入上拉模式 ...

  3. cf13C Sequence(DP)

    题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...

  4. 计算机网络漫谈之IP数据包

    网络层从 网络层 .IP与子网掩码 前前后后我们也说了两次了,IP 这个东西絮絮叨叨的也一直在提.今天我们来解开IP协议的面纱,还记得我们之前在数据链路层说的物理帧的结构吗?就是这样: 其中Head叫 ...

  5. windows端口占用处理方法

    (1)输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是8081,首先找到它.C:\Users\Administrator>netstat -ano活动 ...

  6. 01 | let 和 const语法 | es6

    01 | let 和 const语法 ES6新增了let命令,用来声明变量.它的用法类似于var,但也有区别 let 和 var 1.作用范围不同 var声明的变量在全局范围内都有效,所以全局只有一个 ...

  7. JavaScript 事件循环

    JavaScript 事件循环 事件循环 任务队列 async/await 又是如何处理的呢 ? 定时器问题 阻塞还是非阻塞 实际应用案例 拆分 CPU 过载任务 进度指示 在事件之后做一些事情 事件 ...

  8. sklearn之转换器和估计器

    sklearn之转换器和估计器 转换器 估计器(sklearn机器学习算法的实现) 转换器 想一下之前做的特征工程的步骤? 实例化(实例化的是一个转换器类(Transformer)--特征工程的父类) ...

  9. 后台管理系统:vue&node&MongoDB(一)

    后台管理系统 使用工具: Vue    Node     Mongodb   Element-ui 一.后台(Node+Mongodb) 前期准备: 需要下载的包: mongooes -------- ...

  10. Oracle system 用户无法登录问题

    新手刚用Oracle数据库时,可能会遇到system用户无法登录情况. 问题原因:1.可能输入默认密码时输入错误(比较低级,一般不会范). 2.可能你在安装的时候设置了密码,但是在登录的时候密码不正确 ...