zoukankan      html  css  js  c++  java
  • R提高篇(三): 数据管理一

     目录:

    • 创建新变量
    • 变量重编码
    • 日期值
    • 数据排序
    • 数据集合并
    • 数据子集
    • 随机取样

    创建新变量


    • 算术运算函数:x%%y求余 x mod y,  5%%2的结果为1】, x%/%y  【整数除法,5% / %2 结果为2】, ^或 ** 求幂
    • 如下示例数据,在对象中增加平均、合计变量(场景不大合适,主要为了说明问题)
    • 有多种方式来实现新增变量的处理,推荐使用 transform 示例代码如下:
      > mydata <- transform(mydata,avg = (age + weight)/2 , total = age + weight)
      > mydata
        name age weight   avg total
      1 张三  32     42  37.0    74
      2 李四  45     56  50.5   101
      3 王五  25    120  72.5   145
      4 赵六  39    120  79.5   159
      5 老二 199    180 189.5   379

    变量重编码


    • 变量重编码涉及根据现有变量的值创建新值的过程,如下图,按客户年龄分为青年、中年、老年进行统计
    • 上图中,199明显是异常数据,在进行转换前必须将此赋为缺失值,语法为:
      > mydata$age[mydata$age == 199] <- NA
      > mydata
        name age weight
      1 张三  32     42
      2 李四  45     56
      3 王五  25    120
      4 赵六  39    120
      5 老二  NA    180
    • 变量重编码,示例代码如下:
      > mydata <- within(mydata,{
      +                  agecat <- NA
      +                  agecat[age >= 45] <- "Elder"
      +                  agecat[age > 25 & age < 45] <- "Middle Aged"
      +                  agecat[age <= 25] <- "Young"})
      > mydata
        name age weight      agecat
      1 张三  32     42 Middle Aged
      2 李四  45     56       Elder
      3 王五  25    120       Young
      4 赵六  39    120 Middle Aged
      5 老二  NA    180        <NA>
    • 注意:

      1. with() 与 within() 函数功能类似,不同点在于它允许你修改数据框

      2. 或 (|)与并(&)单字符表示与C#语法不一样
      3. 上图第5行数据包含缺失值,含用缺失值的算术表达式和函数的计算结果也是缺失值,通过na.omit()函数可删除带缺失值的行
      4. 大多数函数都拥有na.rm = TRUE选项,可在计算前移除缺失值并使用剩余的值进行计算,如下
        > sum(mydata$age)
        [1] NA
        > sum(mydata$age,na.rm = TRUE)
        [1] 141

     日期值


    • 日期值默认输入格式为:yyyy-mm-dd, R中通常以字符输入,通过as.Date()函数进行转换,输入格式如下:
      1. %y             两位数的年份                如: 07
      2. %Y             四位数的年份                如: 2007
      3. %a             缩写的星期名                如: Mon
      4. %A             星期名                        如: Monday
      5. %b             缩写的月份                  如:  Jan
      6. %B             月份                          如:  January
      7. %m            月份(00-12)
      8. %d             日期(00-31)
    • sys.Date(): 返回当天的日期
    • date():       返回当前的日期和时间
    • difftime():  计算时间间隔,语法:difftime(time1, time2, units = c("auto", "secs", "mins", "hours","days", "weeks"))
    • 注意:R内部最小日期  1970.01.01
    • 示例如下:
      > t <- Sys.time();t                      #获取当前时间
      [1] "2016-10-11 17:43:27 CST"
      > as.POSIXlt(t-24*60*60)                 #获取一天前的日期
      [1] "2016-10-10 17:43:27 CST"
      > l <- unclass(t);l                      #长整形的数据自1970-01-01年开始
      [1] 1476179008
      > as.POSIXct(l,origin = "1970-01-01")    #将长整形的数据转换为日期型数据
      [1] "2016-10-11 17:43:27 CST"
      > format(t,format="%Y-%m-%d %H:%M:%S")   #自定义时间格式
      [1] "2016-10-11 17:43:27"
      > dob<-as.Date("2016-10-01")  
      > difftime(t,dob,units = "days")         #计算时间差
      Time difference of 10.40518 days

     数据排序


    • order()函数可对一个数据框排序,默认是升序,在变量前加减号可得到降序的排序效果
    • 上例按年龄升序、体重降序排列代码示例:
      > with(mydata,{
      +   orderData <<- mydata[order(age,-weight),]  
      + })
      > orderData
        name age weight   avg total
      3 王五  25    120  72.5   145
      1 张三  32     42  37.0    74
      4 赵六  39    120  79.5   159
      2 李四  45     56  50.5   101
      5 老二 199    180 189.5   379

     数据集合并


    • merge(): 通过一个或多个共有变量横向合半两个数据框(即一种内联结,inner join)
    • 语法: total <- merge(dataframeA, dataframeB,by=c("ID","country"))    #按ID和country进行合并
    • 按下面各科成绩数据与第一小节人员信息数据集合并示例
    • 示例代码:
      > merge(m1,score,by=c("name"))
        name age weight  yw  sx  yy
      1 老二 199    180 100 100 100
      2 李四  45     56  80  87  76
      3 王五  25    120 100  98  87
      4 张三  32     42  90  80 100
      5 赵六  39    120  94  92  90
    •  cbind(): 直接横向合并两个数据框,不需要指定公共索引时使用,要求:每个对象拥有相同的数据行数和排序顺序
    • 示例代码:
      > cbind(m1,score)
        name age weight name  yw  sx  yy
      1 张三  32     42 张三  90  80 100
      2 李四  45     56 李四  80  87  76
      3 王五  25    120 王五 100  98  87
      4 赵六  39    120 赵六  94  92  90
      5 老二 199    180 老二 100 100 100
    • rbind(): 纵向合并两个数据框(两个数据框必须拥有相同的变量名,顺序不必一定相同), 示例如下:
      > m2 <- data.frame(name=m1$name,yw=m1$age,sx=m1$weight,yy=m1$weight%%m1$age)
      > rbind(m2,score)
         name  yw  sx  yy
      1  张三  32  42  10
      2  李四  45  56  11
      3  王五  25 120  20
      4  赵六  39 120   3
      5  老二 199 180 180
      6  张三  90  80 100
      7  李四  80  87  76
      8  王五 100  98  87
      9  赵六  94  92  90
      10 老二 100 100 100

    数据集取子集


    • 以上一节 cbind(m1,score) 合并后的数据集为例,取1、2、6、7 列数据,实现方式如下:
    • 方式一:保留变量
      > x <- cbind(m1,score);x
        name age weight test name  yw  sx  yy
      1 张三  32     42   10 张三  90  80 100
      2 李四  45     56   11 李四  80  87  76
      3 王五  25    120   20 王五 100  98  87
      4 赵六  39    120    3 赵六  94  92  90
      5 老二 199    180  180 老二 100 100 100
      > y <- x[,c(1,2,5,6)];y
        name age name.1  yw
      1 张三  32   张三  90
      2 李四  45   李四  80
      3 王五  25   王五 100
      4 赵六  39   赵六  94
      5 老二 199   老二 100
    • 方式二:剔除变量 (在某一列的前面加负号就会剔除某列)
      > z <- x[,c(-3,-4,-5,-8)];z
        name age  yw  sx
      1 张三  32  90  80
      2 李四  45  80  87
      3 王五  25 100  98
      4 赵六  39  94  92
      5 老二 199 100 100
    • 方式三:赋NULL值,注意:NULL 与 NA是不同的
    > x$weight <- x$test <- x[,5] <- x$yy <- NULL
    > x
      name age  yw  sx
    1 张三  32  90  80
    2 李四  45  80  87
    3 王五  25 100  98
    4 赵六  39  94  92
    5 老二 199 100 100
    • 方式四:subset()取子集
      > x1 <- cbind(m1,score);x1
        name age weight name  yw  sx  yy
      1 张三  32     42 张三  90  80 100
      2 李四  45     56 李四  80  87  76
      3 王五  25    120 王五 100  98  87
      4 赵六  39    120 赵六  94  92  90
      5 老二 199    180 老二 100 100 100
      >  subset(x1,age>=25 & age < 50,select = c("name","age","yw","sx"))
        name age  yw sx
      1 张三  32  90 80
      2 李四  45  80 87
      3 王五  25 100 98
      4 赵六  39  94 92
    • 方法五: sqldf()函数使用sql语句对数据框进行操作,需安装 sqldf 包,语法: install.packages("sqldf")
      > x1 <- merge(m1,score,by=c("name"));x1
        name age weight  yw  sx  yy
      1 老二 199    180 100 100 100
      2 李四  45     56  80  87  76
      3 王五  25    120 100  98  87
      4 张三  32     42  90  80 100
      5 赵六  39    120  94  92  90
      >  library(sqldf)
      >  sqldf("select name,age,yw,sx,yy from x1 where age >=25 and age < 35 order by age")
        name age  yw sx  yy
      1 王五  25 100 98  87
      2 张三  32  90 80 100

    随机取样


      • sample():  从大数据库中随机抽取大小为n的样本,在数据挖掘和机器学习领域,抽样是常见的做法
      • replace 参数控制抽取数据有放回或无放回
      • 示例:从上例x1 对象中随机无放回取2份样本
        > y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),]
        > y1
          name age weight yw sx yy
        2 李四  45     56 80 87 76
        5 赵六  39    120 94 92 90
        > y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),]
        > y1
          name age weight  yw  sx  yy
        1 老二 199    180 100 100 100
        3 王五  25    120 100  98  87
  • 相关阅读:
    js禁止页面回退,刷新,右键代码
    asp.net网站中的Gridview循环判断数据是否被选中
    Gridview中同时选中并删除多个数据
    asp.net中在后台更换控件图片的代码
    关于gcd的8题
    flash AIR 通过BitmapData生成图片到android Camera相册
    flash AIR 通过BitmapData生成图片到本地
    C的随机数
    xcode svn设置事项
    拒绝session丢失 利用DIV层实现对模态窗口的模拟
  • 原文地址:https://www.cnblogs.com/tgzhu/p/5946950.html
Copyright © 2011-2022 走看看