• R简易入门(二)


    本文内容来源:https://www.dataquest.io/mission/128/working-with-data-frames

    本文摘要:简单介绍一下用R处理数据

     

    原始数据展示(这是一份UFO的目击统计报告,每一行代表了一份目击报告的信息,date sighted - 目击UFO的日期, date reported - 报告日期,duration - 目击时长, latitude - 纬度, longitude - 经度)

    date sighted,date reported,duration,city,state,geocode score,geocode precision,latitude,longitude
    
    20040616,20040617,1 minute, Willoughby Hills, OH,0.743,zip,25.3166667,85.2833333
    
    20021116,20021120,30 seconds, Halls Gap (near Melbourne) (NSW, Australia),0.768,zip,-37.8139965641595,144.963322877884
    
    19920615,19961203,2-3 mins, River Falls, WI,0.757,zip,39.3666667,22.9458333

     

    读取数据

    ufos <- read.csv('ufo_sightings.csv')
    
    print( head(ufos, 5)) # 输出文件的前5行
    
    print( tail(ufos, 5))  # 输出文件的后5行
    
    print( str(ufos)) # 以更容易阅读的格式输出,同时输出没一列的数据类型

    Image 009

     

    任务一:统计每一年的UFO报告数量

    因为要统计每一年报告的数量,即要处理的是date.reported这一列的数据,由于每个数据都包含了年月日,而现在只需要年份,所以可以将数据格式转换为字符类型,然后截断前四位的年份数据即可

    dateReported <- as.character(ufos$date.reported)

    使用as.character函数来转变数据类型为字符类型,同理,as.int函数转变为整数类型;ufos$date.reported 返回的是ufos中的date.reported这一列,等价于ufos[,"date.sighted"]

    Image 014

     

    使用substr函数来截断数据,该函数的第一个参数指定要截断的数据,第二个参数指定起始位置,第三个参数指定结束位置

    years <- substr(dateSighted, 1, 4)

    Image 013

     

    统计每一个年份究竟出现了多少次,可以直接使用table函数

    print( table(years))

    Image 015

     

    任务二:去掉不合理的数据

    如果UFO的报告日期date.reported比目击日期date.sighted要前,则说明该数据是不合理的,需要去掉

     

    在上面已经使用过了as.character(ufos$date.reported)来讲日期数据转换为字符格式,现在将字符格式转换为数据格式(不能将数字格式转换为日期格式)

    dateSighted <- as.character(ufos$date.sighted)
    
    dateSighted <- as.Date(dateSighted, "%Y%m%d")
    
    dateReported <- as.Date(as.character(ufos$date.reported), '%Y%m%d')

    原来的数据中的某个日期,譬如:20040617,所以需要指定日期格式为%Y%m%d,如果原数据的格式为2004/06/17,则使用s.Date("2004/06/17", "%Y%m%d"),即格式一定要对应好

     

    对两个日期数据进行减法运算

    delay = dateReported - dateSighted

    对两个向量进行运算,会分成两个情况

    1. 如果两个向量长度相同,则对同一个位置的两个数据进行运算,譬如a <- c(3,4,5)和 b <- c(3,2,1), a - b的结果为c(0,2,4)
    2. 如果两个向量长度不同,就会对少元素的那个向量进行循环运算,譬如a <- c(3,4,5)和b <- 1,a - b的结果是将a中的每个元素都减去b中的唯一一个元素,结果为c(2,3,4);更加诡异的是a <- c(3,4,5,6,7)和b <- c(1,2),此时a - b实际上是将a中的元素按两个一组分别减去b的元素,结果为c(2,2,4,4,6)

     

    布尔运算,对两个向量进行布尔比较会返回一个只包含布尔值的向量

    a <- c(1,2,3)
    
    b <- c(5,2,5)
    
    print(a > b) # 输出 [1] FALSE FALSE FALSE
    
    positiveDelays <- delay > 0 # 判断数据是否合理

     

    过滤数据,可以使用一个只有布尔值的向量来过滤另一个向量或data frame,只保留那些在同样位置为TRUE的值

    filter <- c(TRUE, FALSE, TRUE, FALSE)
    
    bestPlanets <- c("Earth", "Mars", "Jupiter", "Venus")
    
    print(bestPlanets[filter]) # 输出[1] "Earth"   "Jupiter"
    
    filter <- c(FALSE, FALSE, TRUE, TRUE)
    
    bestIceCreamFlavors <- data.frame(c("Peanut Butter Oreo", "Cookie Dough", "Mint Chocolate Chip", "Peanut Butter Cup"))
    
    twoFlavors <- bestIceCreamFlavors[filter,]
    
    print(twoFlavors)

    要注意,对于data frame变量,过滤的时候使用的是[filter, ]而不是[filter],data.frame函数用来组合多列数据为一个新的data frame,该函数的每一个参数都代表了一个向量

    dates = data.frame(dateReported, dateSighted)
    
    positiveDates <- dates[positiveDelays,]

    Image 016

     

    处理缺失数据

    对于缺失的数据,R会使用一个NA来代替,可以使用na.omit函数来移除所有含有空数据的行,他的参数是一个data frame

    cleanDates <- na.omit(positiveDates)
  • 相关阅读:
    linux常用命令:
    解决css添加padding后元素变长的问题
    Hbase常用命令
    集群部署的三种方式(hadoop集群部署三种方式)
    linux编译安装指定依赖的软件包
    vue使用Element隐藏侧边栏进度条
    css相对于父容器,固定放在底部并撑满
    java中23种设计模式
    adb remount'的作用是什么?在什么情况下有用?
    java常用http请求库
  • 原文地址:https://www.cnblogs.com/kylinlin/p/5277009.html
Copyright © 2020-2023  润新知