目录:

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

创建新变量


  • 算术运算函数: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

R提高篇(三): 数据管理一的更多相关文章

  1. R提高篇(四): 数据管理二

    目录: 数学函数 统计函数 应用示例 控制流 数学函数 ceiling(x):  大于等于 x  的最小整数, 如:  ceiling(3.213)  --> 4 floor(x):     小 ...

  2. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  3. java提高篇(三)-----java的四舍五入

    Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...

  4. R提高篇(二): 图形初阶

    目录: 图形示例 图形参数 符号.线条 颜色 文本属性 尺寸与边界 自定义标题 自定义坐标轴 图例 文本标注 图形组合 图形示例 如下代码描述病人对两种药物五个剂量水平上的响应情况 > myda ...

  5. R提高篇(五): 描述性统计分析

    数据作为信息的载体,要分析数据中包含的主要信息,即要分析数据的主要特征(即数据的数字特征), 对于数据的数字特征, 包含数据的集中位置.分散程度和数据分布,常用统计项目如下: 集中趋势统计量:  均值 ...

  6. R提高篇(一): 输入输出

    目录: 文本输出 图形输出 数据输入 数据框输出 文本导入 Excel导入 文本输出 语法: sink(file = NULL, append = FALSE, type = c("outp ...

  7. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  8. Maven提高篇系列之(三)——使用自己的Repository(Nexus)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  9. java提高篇(三)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

随机推荐

  1. HDU 5050

    http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数gcd import java.io.* ; import java.math.* ; import ...

  2. 架设 OpenLDAP服务器(转)

    OpenLDAP是一个开放源代码的软件,可以免费获取使用,其主页地址是:http://www.openldap.org/.在RHEL 6上安装OpenLDAP还需要libtool-ltdl-2.2.6 ...

  3. u32 mac以及arp匹配

    # Examples that match MAC (a big "thank you" to Julian Anastasov for this!): M0 through M5 ...

  4. 扩展KVM镜像的虚拟磁盘大小

    当我们需要扩展模板镜像的虚拟磁盘大小时,比如原来的虚拟磁盘大小为20G,现在我们想将其扩展到30G,那么我们可以根据如下步骤来操作. 整个流程可以分为三个阶段: 1.扩展KVM镜像磁盘文件大小到30G ...

  5. hdu 2665 Kth number

    划分树 /* HDU 2665 Kth number 划分树 */ #include<stdio.h> #include<iostream> #include<strin ...

  6. .NET 里 静态方法的并发处理

    静态方法在程序运行时 就已经实例化好了 不管多少用户并发 都一样处理,不需要排队等待,实例代码: namespace DotNet.Example { using DotNet.BaseManager ...

  7. 矩阵卷积Matlab(转载)

    转载自:http://blog.csdn.net/anan1205/article/details/12313593 两个矩阵卷积转化为矩阵相乘形式--Matlab应用(这里考虑二维矩阵,在图像中对应 ...

  8. linux中进程控制

    1.进程标识 每个进程都有一个非负整型表示的唯一的进程ID.进程ID标识符总是唯一的.  虽然进程ID是唯一的,但某个ID被回收后,ID号是可以复用的. ID为0的进程通常是调度进程(其常常被称交换进 ...

  9. java 日期格式 毫秒

    参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...

  10. UVa 10082 WERTYU

    UVa 10082 题目大意:把手放在键盘上时,稍微不注意就会往右错一位.这样,输入Q就会变成输入W,输入J会变成输入K等等, 输入一个错位后敲出的字符串(所有字母均大写),输出程序员本来想打的句子. ...