我们先创建一个基础数据框df,用madata记录初始值.
初值备份是一个良好的习惯,这可避免你在误操作后丢失初值.

> manager<-c(1,2,3,4,5)
> date<-c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
> country<-c("us","us","us","uk","ch")
> df<-data.frame(manager,date,country,stringsAsFactors = FALSE)
> mydata<-df #记录数据框的初始值
> dfmanager     date country
1       1 10/24/08       us
2       2 10/28/08       us
3       3  10/1/08       us
4       4 10/12/08       uk
5       5   5/1/09       ch

1.变量的新增

1.1新增变量与已有变量无关

对于上述数据框df,如果想增加一个变量age<-c(32,10,65,150,46):

> df$age<-c(32,10,65,150,46)
> dfmanager     date country age
1       1 10/24/08      us  32
2       2 10/28/08      us  10
3       3  10/1/08      us  65
4       4 10/12/08      uk 150
5       5   5/1/09      ch  46

1.2新增与已有变量相关

如果你想将countrymanger变量合并为一个变量:country_manager:那么首先要新增country_manager变量,再删除countrymanger变量.
country_manager变量的添加方法如下:
方法1:
下面代码中的$用于访问数据框中的变量;paste()函数用于拼接字符,其参数sep="_"指定了字符连接符为下划线;as.character()函数用于将对象转换为character类型.

> df$country_manager<-paste(df$country,as.character(df$manager),sep="_")
> dfmanager     date country age country_manager
1       1 10/24/08      us  32            us_1
2       2 10/28/08      us  10            us_2
3       3  10/1/08      us  65            us_3
4       4 10/12/08      uk 150            uk_4
5       5   5/1/09      ch  46            ch_5

这种方法每次访问变量都需要数据框名$变量名,代码冗杂,且每次只能添加一个变量,使用transform()函数可以简化其过程.
方法2:transform()函数

> transform(mydata,age=c(32,10,65,150,46),#madata是df的初始值,可参看初始代码country_manager=paste(country,as.character(manager),sep = "_"))#本行transform前没有使用"<-"赋值号,因此可保护mydata的值不受影响manager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
4       4 10/12/08       uk 150            uk_4
5       5   5/1/09       ch  46            ch_5

上述代码使用transform()函数同时添加了变量agecountry_manager

此外,你也可以通过其它连续型变量的观测结果来创建类型变量:
添加变量age_cat<-c(young,middle aged,elder) ,根据age变量的值,<=40定义为young,40~64定义为middle aged,>64定义为elder:

> df$age_cat[df$age<=40]<-"young"
> df$age_cat[df$age>40 & df$age<65]<-"middle aged"
> df$age_cat[df$age>=6540]<-"elder"
> dfmanager     date country age country_manager     age_cat
1       1 10/24/08       us  32            us_1       young
2       2 10/28/08       us  10            us_2       young
3       3  10/1/08       us  65            us_3       elder
4       4 10/12/08       uk 150            uk_4       elder
5       5   5/1/09       ch  46            ch_5 middle aged

使用within()函数可简化上述代码:

> df<-whthin(df,{age_cat<-NAage_cat[age<=40]<-"young"age_cat[age>40 & age<65]<-"middle aged"age_cat[age>=65]<-"elder"})

2.数据框的横向合并

2.1无联接数据框的合并

若两个数据框没有相同变量,则称他们是无联接的.

new_df<-cbind(df_a,df_b)

只有当两个数据框的行数相同且顺序对应时才能合并.

实际上,对于无联接的数据框,很难掌握他们的同顺序,因此此类合并情况很少

2.2内联接数据框的合并

假设现有数据框A记录了一个班级学生的身高\体重,数据框B记录了该班学生的年龄和性别.显然,A和B中含有相同量是学生姓名_names,则A和B是inner join内联接的.对于A和B的合并方法如下:

AB<-merge(a,b,by="_names")

3.观测(行)的新增

rbind()函数用于数据框的纵向合并.

new_df<-rbind(df_a,df_b)

其中,df_a和df_b数据框的变量应当一样(顺序不必相同).

4.变量重编码

4.1更改观测值

现在对于df:

> dfmanager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
4       4 10/12/08       uk 150            uk_4
5       5   5/1/09       ch  46            ch_5

假如变量date的第四个观测4 10/12/08你已经知道有误,应为01/01/01,可通过如下方式修改:

> df[4,"date"]<-"01/01/01"
> dfmanager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
4       4 01/01/01       uk 150            uk_4
5       5   5/1/09       ch  46            ch_5

4.2设置缺失值

对于age变量的第四个观测150,显然是不合适的,但这行观测的其他值可能还有意义,因此,为了消除这类数据对结果的影响,可以将其设置为缺失值NA,
对于年龄大于99的均认为其无意义:

> df$age[df$age>99]<-NA
> dfmanager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
4       4 01/01/01       uk  NA            uk_4
5       5   5/1/09       ch  46            ch_5

PS:is.no()函数用于检测缺失值NA是否存在.

> is.na(df[,"age"])
[1] FALSE FALSE FALSE  TRUE FALSE

4.3日期值

在不同的应用场景,日期值的标识格式有很大不同,本节主要介绍日期值的格式转换和计算…

4.3.1日期的读入格式

日期的输入一般是字符型,存储则是数值相组合的形式.as.Date()函数用于完成类型转换.

> mydates<-as.Date(c("2020-01-01","2020-02-02"))
> mydates
[1] "2020-01-01" "2020-02-02"

日期默认格式为yyyy-mm-dd,输入必须与指定格式完全一致,否则将报错.
如果要读入自定义格式的日期,可以根据下表指定日期格式.

符号 含义
%d 数字形式的日期,如25,01,31
%a 缩写的星期名,如Mon
%A 星期的全称,如Sunday
%m 月份,如00,12
%b 缩写的月份,如Jan
%B 月份全称,如January
%y 两位数的年份,如20,98
%Y 四位数的年份,如2020,1998

下面代码读取了自定义格式的日期:

> as.Date("08/30/2020","%m/%d/%Y")
[1] "2020-08-30"

4.3.2获取系统日期及日期计算

Sys.Date()date()函数分别用于获取系统当前的日期和时间.

> now_date<-Sys.Date()
> now_time<-date()
> now_date
[1] "2020-08-08"
> now_time
[1] "Sat Aug 08 14:23:29 2020"
> class(now_date)
[1] "Date"
> class(now_time)
[1] "character"

你可以使用format()函数来获取日期值的指定部分,仅对Date类型变量有效,因此不能用于now_time.

> format(now_date,format="%m~%d")
[1] "08~08"
  • R内部对日期的存储是以自1970-01-01以来的天数记录的,这个时间之前的日期为负数.
    日期值可以进行算术运算,其结果为天数.
> s_date<-as.Date("1998-09-06")
> days<-now_date-s_date
> days
Time difference of 8007 days

也可以使用diff time()函数来指定结果的表达形式.

> difftime(now_date,s_date,units = "hours")
Time difference of 192168 hours

注意

  • 缺失值与不可与任何值做比较(包括其本身),也就是说var==NA的结果与var无关,永远是FALSE.
  • 正无穷和负无穷分别标记为Inf-Inf
  • 对于无法计算或表达的值,比如sin(Inf)应当标记为NAN
  • 含有缺失值NA的算术表达式和函数的结果也是缺失值,即无非特殊需要,应在处理数据前剔出缺失值.
> na.omit(df)manager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
5       5   5/1/09       ch  46            ch_5
> dfmanager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
4       4 01/01/01       uk  NA            uk_4
5       5   5/1/09       ch  46            ch_5

na.omit()函数删除了含有缺失值观测(行),但并不是直接在df上操作的.

5.数据集取子集

5.1选入变量

在需要选入变量比较少的时候,rdataframe[row indices,column indices]方法无疑是优秀的.

new_df<-old_df[,c("name","age","weight")]

上列将选入name,age,weight这三个变量的全部观测.

5.2丢弃变量

在变量数量比较多的时候,反选将更有优势.

> dfmanager     date country age country_manager
1       1 10/24/08       us  32            us_1
2       2 10/28/08       us  10            us_2
3       3  10/1/08       us  65            us_3
4       4 01/01/01       uk  NA            uk_4
5       5   5/1/09       ch  46            ch_5
> arr<-names(df) %in% c("manager","country")
> arr
[1]  TRUE FALSE  TRUE FALSE FALSE
> new_df<-df[!arr]
> new_dfdate age country_manager
1 10/24/08  32            us_1
2 10/28/08  10            us_2
3  10/1/08  65            us_3
4 01/01/01  NA            uk_4
5   5/1/09  46            ch_5

5.3选入观测

观测的选入与4.1,4.2节变量的选入类似,这里仅介绍特定日期观测的范例.

#规定要选入的日期范围
> e_date<-as.Date("12/31/08","%m/%d/%y")
> s_date<-as.Date("2008-01-01")
> #将数据框的date值转为日期类型
> df$date<-as.Date(df$date,"%m/%d/%y")
> dfmanager       date counntry age country_manager
1       1 2008-10-24       us  32            us_1
2       2 2008-10-28       us  10            us_2
3       3 2008-10-01       us  65            us_3
4       4 2001-01-01       uk  NA            uk_4
5       5 2009-05-01       ch  46            ch_5
#选择观测
> new_df<-df[which(df$date>=s_date & df$date<=e_date),]
> new_dfmanager       date counntry age country_manager
1       1 2008-10-24       us  32            us_1
2       2 2008-10-28       us  10            us_2
3       3 2008-10-01       us  65            us_3

5.4subset()函数

该函数可同时选取变量与输入.

> new_df<-subset(df,age>15 & age<=50,select=country:country_manager)
> new_dfcountry age country_manager
1       us  32            us_1
5       ch  46            ch_5

以上代码选择了变量age介于15和50之间的行中,country至country_manager的所有列.

6.排序

order()函数默认对数据框做升序排序,在排序变量前加-可进行降序排序.

> df[order(df$age),]manager     date counntry age country_manager
2       2 10/28/08       us  10            us_2
1       1 10/24/08       us  32            us_1
5       5   5/1/09       ch  46            ch_5
3       3  10/1/08       us  65            us_3
4       4 01/01/01       uk  NA            uk_4

注意上述代码df[order(df$age),]中的逗号,含义是选择所有的列后,将行按照变量age的观测排序.改变逗号处的内容,可以自定义需要排序的列.

实际中可能遇到年龄相同的观测,你也可以在order()函数里再多加一个排序变量:

>df[order(df$age,-df$manager),]

这样在遇到年龄相同的观测值时,会按照manager变量的降序排列.

R语言学习笔记NO.2 数据处理的基础操作_变量/观测的增改选排相关推荐

  1. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  2. R语言学习笔记(1~3)

    R语言学习笔记(1~3) 一.R语言介绍 x <- rnorm(5) 创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差. 1.1 注释 由符号#开头. #函数c()以向量的形式输 ...

  3. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  4. R语言学习笔记 07 Probit、Logistic回归

    R语言学习笔记 文章目录 R语言学习笔记 probit回归 factor()和as.factor() relevel() 案例11.4复刻 glm函数 整理变量 回归:Logistic和Probit- ...

  5. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

  6. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  7. R语言学习笔记 06 岭回归、lasso回归

    R语言学习笔记 文章目录 R语言学习笔记 比较lm.ridge和glmnet函数 画岭迹图 图6-4 <统计学习导论 基于R语言的应用>P182 图6-6<统计学习导论 基于R语言的 ...

  8. R语言学习笔记(八)--读写文件与网络爬虫

    R语言学习笔记(八) 1 工作路径 2 保存R对象 3 Scan函数 3-1 从控制台读取数据 3-2 从txt文件读取数据 3-3 从url读取数据 4 按行读写文本文件 5 读取文本文件(txt. ...

  9. R语言学习笔记(三)多元数据的数据特征、相关分析与图形表示

    文章目录 写在前面 独立性检验 χ2\chi^2χ2独立性检验 Fisher独立性检验 Cochran-Mantel-Haenszel χ2\chi^2χ2独立性检验 相关性分析 相关性检验 相关性检 ...

最新文章

  1. CV入门赛最全思路上分技巧汇总!
  2. 寻找数组中最小的k个数(快排和堆排)
  3. asp.net ajax检查用户名是否存在代码
  4. 高德地图路线规划 时间_路线准、播报拥堵及时,这次自驾出行高德地图可算是帮了大忙...
  5. 【Immutable】拷贝与JSON.parse(JSON.stringify()),深度比较相等与underscore.isEqual(),性能比较...
  6. Oracle数据库SqlLoad常用技巧总结word版
  7. 11.Axis客户端接收不同参数类型
  8. 使用Prometheus监控Flink
  9. 新年干货 | NLP一路走来的经验之谈
  10. html tab标签_如何用HTML写一个网页
  11. Hadoop分布式大数据平台
  12. 关于旅游景点主题的HTML网页设计——北京景点 7页(带订单购物车)
  13. 【ChatGPT】GPT-4
  14. 详解spring用到的九种设计模式
  15. Python实现最速下降法(The steepest descent method)详细案例
  16. 液压管路渗漏图像识别检测方法研究
  17. 互联网的女性主义特征(转载)
  18. java.double和 floa 的区别
  19. 读《VR虚拟现实与AR增强现实的技术原理与商业应用》
  20. js实现记住账号密码——学习笔记

热门文章

  1. 2021年计算机类考研人数,2021考研报名人数最多的八大专业
  2. 前端码农日常英语学习
  3. 使用路由器搭建机器人局域网,进而远程机器人主机
  4. 吃烧烤之命令模式学习笔记[C++版] 1
  5. nexus学习 五、搭建阿里云代理
  6. java销售增加 库存减少_java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目...
  7. 等差数列java_java简单的编程(等差数列)
  8. 2020年高校微信小程序开发大赛全国三等奖——《重邮指路牌》
  9. 自组网(Adhoc)和基础网(Infra)
  10. 魔兽世界美服部落人数最多服务器,美服部落转联盟服务正式开启 规模继续扩大...