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()
#略