首页 > 代码库 > R提高篇(三): 数据管理一

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

 

R提高篇(三): 数据管理一