• R数据科学2



    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()
    #略
    
  • 相关阅读:
    HTTP长连接、短连接使用及测试
    递归分治算法之二维数组二分查找(Java版本)
    Java二维数组的概念和使用方法
    java二维数组遍历
    HashMap多线程并发问题分析
    Linux 移动或重命名文件/目录-mv 的10个实用例子
    CSS fixed 定位元素失效的问题
    关于 JavaScript 中的继承
    React 虚拟 DOM 的差异检测机制
    下拉框中选项的快速定位
  • 原文地址:https://www.cnblogs.com/jessepeng/p/10926876.html
Copyright © 2020-2023  润新知