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> 注意:
with() 与 within() 函数功能类似,不同点在于它允许你修改数据框
- 或 (|)与并(&)单字符表示与C#语法不一样
 - 上图第5行数据包含缺失值,含用缺失值的算术表达式和函数的计算结果也是缺失值,通过na.omit()函数可删除带缺失值的行
 - 大多数函数都拥有na.rm = TRUE选项,可在计算前移除缺失值并使用剩余的值进行计算,如下
> sum(mydata$age)
[1] NA
> sum(mydata$age,na.rm = TRUE)
[1] 141 
日期值
- 日期值默认输入格式为:yyyy-mm-dd, R中通常以字符输入,通过as.Date()函数进行转换,输入格式如下:
 
- %y 两位数的年份 如: 07
 - %Y 四位数的年份 如: 2007
 - %a 缩写的星期名 如: Mon
 - %A 星期名 如: Monday
 - %b 缩写的月份 如: Jan
 - %B 月份 如: January
 - %m 月份(00-12)
 - %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提高篇(三): 数据管理一的更多相关文章
- R提高篇(四): 数据管理二
		
目录: 数学函数 统计函数 应用示例 控制流 数学函数 ceiling(x): 大于等于 x 的最小整数, 如: ceiling(3.213) --> 4 floor(x): 小 ...
 - Java提高篇(三二)-----List总结
		
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
 - java提高篇(三)-----java的四舍五入
		
Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...
 - R提高篇(二): 图形初阶
		
目录: 图形示例 图形参数 符号.线条 颜色 文本属性 尺寸与边界 自定义标题 自定义坐标轴 图例 文本标注 图形组合 图形示例 如下代码描述病人对两种药物五个剂量水平上的响应情况 > myda ...
 - R提高篇(五): 描述性统计分析
		
数据作为信息的载体,要分析数据中包含的主要信息,即要分析数据的主要特征(即数据的数字特征), 对于数据的数字特征, 包含数据的集中位置.分散程度和数据分布,常用统计项目如下: 集中趋势统计量: 均值 ...
 - R提高篇(一): 输入输出
		
目录: 文本输出 图形输出 数据输入 数据框输出 文本导入 Excel导入 文本输出 语法: sink(file = NULL, append = FALSE, type = c("outp ...
 - java提高篇(三十)-----Iterator
		
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
 - Maven提高篇系列之(三)——使用自己的Repository(Nexus)
		
这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...
 - java提高篇(三)-----理解java的三大特性之多态
		
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
 
随机推荐
- 让UIWebView弹出键盘上的按钮显示中文
			
UIWebView是一个很常用的视图,一般用来加载网页,比如百度: 点击文本框输入框后,会弹出一个带有toolbar的键盘,toolbar中有3个辅助按钮 有了这3个按钮,是方便很多,但默认是英文的, ...
 - 四、CCSprite
			
在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵.精灵也称为游戏对象,它可以用来表示游戏中的任何物体,比如敌人.子弹.甚至是一个背景图片.一段文字.CCSprite可以说是在coco ...
 - jsb游戏闪退 ScriptingScore::executeFunctionWithOwner 出错
			
Assertion failure: thing, at...gc/Marking.cpp:112 遇到个jsb的bug,全公司的人整整折腾了2天!! 描述: 下面代码,在GC后,程序崩溃,错误log ...
 - 如何写 github wiki
			
在你库里面的文件夹下 点击wiki进入编辑页面 如何编辑: header以#开始, #代表一级header, ##代表二级header... 段落直接以空行分隔. 每行后面加两个以上的空格 分条列举的 ...
 - 使用oss批量上传图片
			
<?php set_time_limit(0);// 引入自动加载类// 确保路径是否正确require_once 'autoload.php';// 确定参数 需要申请$accessKeyId ...
 - C/C++程序员必须熟练应用的开源项目(转-清风小阁)
			
作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...
 - 网站后台的lnmp启动与重启
			
网站建立时间很长了,经常挂掉,又没有其他技术人员带.只好自己摸索着修复. 到今天网站已经挂掉了一个礼拜.请求各路大神无果后决定自己修复. 首先出现的是502,网关错误. 1.上阿里云服务用户中心重新启 ...
 - 如何生成a1,a2,a3,a4这样的变量名
			
var num=6; function Girl(beautifulScore){ this.beautifulScore=beautifulScore; } var girls=[]; for (v ...
 - web前端学习策略
 - [CTSC 2012][BZOJ 2806]Cheat
			
真是一道好题喵~ 果然自动机什么的就是要和 dp 搞基才是王道有木有! A:连 CTSC 都叫我们搞基,果然身为一个程序猿,加入 FFF 团是我此生最明智的选择.妹子什么闪边去,大家一起来搞基吧! Q ...