你的位置:首页 > 数据库

[数据库]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 total1 张三 32   42 37.0  742 李四 45   56 50.5  1013 王五 25  120 72.5  1454 赵六 39  120 79.5  1595 老二 199  180 189.5  379

 

变量重编码


  • 变量重编码涉及根据现有变量的值创建新值的过程,如下图,按客户年龄分为青年、中年、老年进行统计
  • 上图中,199明显是异常数据,在进行转换前必须将此赋为缺失值,语法为:
    > mydata$age[mydata$age == 199] <- NA> mydata name age weight1 张三 32   422 李四 45   563 王五 25  1204 赵六 39  1205 老二 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   agecat1 张三 32   42 Middle Aged2 李四 45   56    Elder3 王五 25  120    Young4 赵六 39  120 Middle Aged5 老二 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 total3 王五 25  120 72.5  1451 张三 32   42 37.0  744 赵六 39  120 79.5  1592 李四 45   56 50.5  1015 老二 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 yy1 老二 199  180 100 100 1002 李四 45   56 80 87 763 王五 25  120 100 98 874 张三 32   42 90 80 1005 赵六 39  120 94 92 90

  •  cbind(): 直接横向合并两个数据框,不需要指定公共索引时使用,要求:每个对象拥有相同的数据行数和排序顺序
  • 示例代码:
    > cbind(m1,score) name age weight name yw sx yy1 张三 32   42 张三 90 80 1002 李四 45   56 李四 80 87 763 王五 25  120 王五 100 98 874 赵六 39  120 赵六 94 92 905 老二 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 yy1 张三 32 42 102 李四 45 56 113 王五 25 120 204 赵六 39 120  35 老二 199 180 1806 张三 90 80 1007 李四 80 87 768 王五 100 98 879 赵六 94 92 9010 老二 100 100 100

  •  

数据集取子集


  • 以上一节 cbind(m1,score) 合并后的数据集为例,取1、2、6、7 列数据,实现方式如下:
  • 方式一:保留变量
    > x <- cbind(m1,score);x name age weight test name yw sx yy1 张三 32   42  10 张三 90 80 1002 李四 45   56  11 李四 80 87 763 王五 25  120  20 王五 100 98 874 赵六 39  120  3 赵六 94 92 905 老二 199  180 180 老二 100 100 100> y <- x[,c(1,2,5,6)];y name age name.1 yw1 张三 32  张三 902 李四 45  李四 803 王五 25  王五 1004 赵六 39  赵六 945 老二 199  老二 100

  • 方式二:剔除变量 (在某一列的前面加负号就会剔除某列)
    > z <- x[,c(-3,-4,-5,-8)];z name age yw sx1 张三 32 90 802 李四 45 80 873 王五 25 100 984 赵六 39 94 925 老二 199 100 100

  • 方式三:赋NULL值,注意:NULL 与 NA是不同的
> x$weight <- x$test <- x[,5] <- x$yy <- NULL> x name age yw sx1 张三 32 90 802 李四 45 80 873 王五 25 100 984 赵六 39 94 925 老二 199 100 100

  • 方式四:subset()取子集
    > x1 <- cbind(m1,score);x1 name age weight name yw sx yy1 张三 32   42 张三 90 80 1002 李四 45   56 李四 80 87 763 王五 25  120 王五 100 98 874 赵六 39  120 赵六 94 92 905 老二 199  180 老二 100 100 100> subset(x1,age>=25 & age < 50,select = c("name","age","yw","sx")) name age yw sx1 张三 32 90 802 李四 45 80 873 王五 25 100 984 赵六 39 94 92

  • 方法五: sqldf()函数使用sql语句对数据框进行操作,需安装 sqldf 包,语法: install.packages("sqldf")
    > x1 <- merge(m1,score,by=c("name"));x1 name age weight yw sx yy1 老二 199  180 100 100 1002 李四 45   56 80 87 763 王五 25  120 100 98 874 张三 32   42 90 80 1005 赵六 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 yy1 王五 25 100 98 872 张三 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 yy2 李四 45   56 80 87 765 赵六 39  120 94 92 90> y1 <- x1[sample(1:nrow(x1),size = 2,replace = FALSE),]> y1 name age weight yw sx yy1 老二 199  180 100 100 1003 王五 25  120 100 98 87