R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。在学习R数据科学之前,我们首先要对R语言的基础语法有一个良好的了解,方便我们理解以后的数据科学算法。本次语法精讲分三次讲完,每次负责讲解其中一部分!本次的R语言语法精讲(三)主要介绍了 R语言的数据处理技术,涉及到很多数据科学常用的数据预处理技术。学完本文后,您将可以完全掌握R语言数据处理与数据分析的能力,并结合R语言语法精讲(一)和R语言语法精讲(二)以及您的专业知识,可以解决大多数数据分析的系统工作,已经可以熟练运用R语言进行数据建模。

本文引用:

《R语言实战--第2版》---------Robert I.Kabacoff

《统计计算与模拟》课程课件-------深圳大学林炳清老师

本文内容:

  • R常用数据结构
  • R的运算以及常用函数
  • R语言编程结构
    判断if-else
    循环for、while、repeat
    自定义函数
  • R的输入与输出
  • R基础绘图
  • 基本数据管理(本文)
  • 高级数据管理(本文)

1.基本数据管理

1.1 创建leadership数据框

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", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age, q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
leadership

1.2 创建新变量

mydata<-data.frame(x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8))
# 方式1
mydata$sumx  <-  mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2 # 方式2
attach(mydata)
mydata$sumx  <-  x1 + x2
mydata$meanx <- (x1 + x2)/2
detach(mydata) # 方式3(推荐)
mydata <- transform(mydata, sumx  =  x1 + x2, meanx = (x1 + x2)/2)
mydata

1.3 变量的重编码

重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程。举例来说,你可能想:

  • 将一个连续型变量修改为一组类别值;
  • 将误编码的值替换为正确值;
  • 基于一组分数线创建一个表示及格/不及格的变量。
# 方式1:
leadership$age[leadership$age  == 99]    <- NA
leadership$agecat[leadership$age  > 75]  <- "Elder"
leadership$agecat[leadership$age >= 55 &  leadership$age <= 75]  <- "Middle Aged"
leadership$agecat[leadership$age  < 55]  <- "Young"
# 方式2:使用within()简化代码:
leadership <- within(leadership,{ agecat <- NA  agecat[age > 75]              <- "Elder" agecat[age >= 55 & age <= 75] <- "Middle Aged" agecat[age < 55]              <- "Young" })
leadership 

1.4 变量的重命名

如果对现有的变量名称不满意,你可以交互地或者以编程的方式修改它们。

names(leadership)
names(leadership)[2] <- "testDate"
leadership 

1.5 缺失值

在任何规模的项目中, 数据都可能由于未作答问题、设备故障或误编码数据的缘故而不完整。在R中,缺失值以符号NA(NotAvailable,不可用)表示。

(1) 识别缺失值

y <- c(1, 2, 3, NA)
is.na(y)
is.na(leadership[,6:10])

(2) 探索缺失值模式

处理缺失数据的方法有很多,但不能保证都生成一样的结果。下图列出了一系列可用来处理不完整数据的方法,以及相应的R包。

(2.1) 列表显示缺失值

mice包中的md.pattern()函数可生成一个以矩阵或数据框形式展示缺失值模式的表格。

library(mice)
md.pattern(leadership)

(2.2) 相关性探索缺失值

x <- as.data.frame(abs(is.na(leadership)))
head(leadership, n=5)
head(x, n=5)
y <- x[which(apply(x,2,sum)>0)]
cor(y) 

(3) 在分析中排除缺失值

确定了缺失值的位置以后,你需要在进一步分析数据之前以某种方式删除这些缺失值。原因是,含有缺失值的算术表达式和函数的计算结果也是缺失值。

x <- c(1, 2, NA, 3)
y <- x[1] + x[2] + x[3] + x[4]
y
z <- sum(x)
z  

多数的数值函数都拥有一个na.rm=TRUE选项,可以在计算之前移除缺失值并使用剩余值进行计算:

x <- c(1, 2, NA, 3)
y <- sum(x, na.rm=TRUE)
y

使用na.omit()删除缺失值:

leadership
newdata <- na.omit(leadership)
newdata

1.6 日期值

日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。函数as.Date()用于执行这种转化。其语法为as.Date(x, "input_format"),其中x是字符型数据,input_format则给出了用于读入日期的适当格式:

日期值的默认输入格式为yyyy-mm-dd

# 将默认格式的字符型数据转换为了对应日期
mydates <- as.Date(c("2007-06-22", "2004-02-13"))
mydates
strDates <- c("01/05/1965", "08/16/1975")
strDates
dates <- as.Date(strDates, "%m/%d/%Y")
dates
myformat <- "%m/%d/%y"
leadership$testDate  <- as.Date(leadership$testDate, myformat)
leadership

有两个函数对于处理时间戳数据特别实用。Sys.Date()可以返回当天的日期,而date()则返回当前的日期和时间。

Sys.Date()
date()

可以使用函数difftime()来计算时间间隔,并以星期、天、时、分、秒来表示。

today <- Sys.Date()
dob   <- as.Date("1998-10-12")
difftime(today, dob, units="weeks") 

函数as.character()可将日期值转换为字符型:

strDates <- as.character(dates)

进行转换后,即可使用一系列字符处理函数处理数据(如取子集、替换、连接等)

strDates <- as.character(today)
strDates

1.7 类型转换

a <- c(1,2,3)
a
is.numeric(a)
is.vector(a)
a <- as.character(a)
a
is.numeric(a)
is.vector(a)
is.character(a)

1.8 数据排序

在R中,可以使用order()函数对一个数据框进行排序。默认的排序顺序是升序。在排序变量的前边加一个减号即可得到降序的排序结果。

newdata <- leadership[order(leadership$age),]
newdata
# 将各行依女性到男性、同样性别中按年龄升序排序
attach(leadership)
newdata <- leadership[order(gender, age),]
newdata
detach(leadership)
# 将各行依经理人的性别和年龄降序排序
attach(leadership)
newdata <-leadership[order(gender, -age),]
detach(leadership)
newdata

1.9 数据合并

(1) 向数据框添加列:

要横向合并两个数据框(数据集) ,请使用merge()函数。在多数情况下,两个数据框是通过一个或多个共有变量进行联结的(即一种内联结,inner join) 。

# 将dataframeA和dataframeB按照ID进行了合并
# total <- merge(dataframeA, dataframeB, by="ID")
# 将两个数据框按照ID和Country进行了合并
# total <- merge(dataframeA, dataframeB, by=c("ID","Country"))

(2) 向数据框添加行:

要纵向合并两个数据框(数据集) ,请使用rbind()函数:

total <- rbind(dataframeA, dataframeB)

两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。如果dataframeA中拥有dataframeB中没有的变量,请在合并它们之前做以下某种处理:

删除dataframeA中的多余变量;

在dataframeB中创建追加的变量并将其值设为NA(缺失) 。

纵向联结通常用于向数据框中添加观测。

1.10 数据集取子集

(1) 选入一些变量

newdata <- leadership[, c(6:10)]
newdata
myvars <- c("q1", "q2", "q3", "q4", "q5")
newdata <-leadership[myvars]
newdata

(2) 剔除一些变量

newdata 

(3) 选入观测样本

newdata <- leadership[1:3,]
newdatanewdata <- leadership[leadership$gender=="M" & leadership$age > 30,]
newdataattach(leadership)
newdata <- leadership[gender=='M' & age > 30,]
detach(leadership)
newdata

使用subset()函数大概是选择变量和观测最简单的方法了

# 选择所有age值大于等于35或age值小于24的行,保留了变量q1到q4
newdata <- subset(leadership, age >= 35 | age < 24, select=c(q1, q2, q3, q4))
newdata
# 选择所有25岁以上的男性,并保留了变量gender到q4(gender、q4和其间所有列)
newdata <- subset(leadership, gender=="M" & age > 25,  select=gender:q4)
newdata

(4) 随机抽样

在数据挖掘和机器学习领域,从更大的数据集中抽样是很常见的做法。

# 从leadership数据集中随机抽取一个大小为3的样本
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]
mysample

sample()函数中的第一个参数是一个由要从中抽样的元素组成的向量。在这里,这个向量是1到数据框中观测的数量,第二个参数是要抽取的元素数量,第三个参数表示无放回抽样。sample()函数会返回随机抽样得到的元素,之后即可用于选择数据框中的行。

2.高级数据管理

2.1 数值和字符处理函数

(1) 数学函数

(2) 统计函数

# 向量化运算
x <- c(1,2,3,4,5,6,7,8)
mean(x)
sd(x)

(3) 概率函数

在R中,概率函数形如 :

[dpqr]distribution_abbreviation()

其中第一个字母表示其所指分布的某一方面:

  • d = 密度函数(density)
  • p = 分布函数(distribution function)
  • q = 分位数函数(quantile function)
  • r = 生成随机数(随机偏差)
x <- pretty(c(-3,3), 30)
y <- dnorm(x)
plot(x, y, type = "l",  xlab = "Normal Deviate", ylab = "Density", yaxs = "i"
) 

设置随机种子:

set.seed(1234)
runif(5)
runif(5)

(4) 字符处理函数

(5) 其他函数处理

(6) 将函数应用于矩阵和数据框

R中提供了一个apply()函数,可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。apply()函数的使用格式为:

apply(x, MARGIN, FUN, ...)

其中,x为数据对象,MARGIN是维度的下标,FUN是由你指定的函数,而...则包括了任何想传递给FUN的参数。在矩阵或数据框中,MARGIN=1表示行,MARGIN=2表示列。

mydata <- matrix(rnorm(30), nrow=6)
mydata
# 计算每列的均值
apply(mydata, 2, mean)
# 计算每行的截尾均值,截尾均值基于中间60%的数据, 最高和最低20%的值均被忽略
apply(mydata, 2, mean, trim=0.2) 

2.2 整合与重构

R中提供了许多用来整合(aggregate)和重塑(reshape)数据的强大方法。在整合数据时,往往将多组观测替换为根据这些观测计算的描述性统计量。在重塑数据时,则会通过修改数据的结构(行和列)来决定数据的组织方式。

(1) 转置

转置(反转行和列)也许是重塑数据集的众多方法中最简单的一个了。使用函数t()即可对一个矩阵或数据框进行转置。对于后者,行名将成为变量(列)名。

cars <- mtcars[1:5,1:4]
cars
t(cars)

(2) 整合数据

在R中使用一个或多个by变量和一个预先定义好的函数来折叠 (collapse) 数据是比较容易的。

调用格式为:

aggregate(x, by, FUN)

其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它将被用来计算新观测中的值。

options(digits=3)
attach(mtcars)
aggdata <-aggregate(mtcars, by=list(cyl,gear), FUN=mean, na.rm=TRUE)
aggdata 

在结果中,Group.1表示汽缸数量(4、6或8),Group.2代表挡位数(3、4或5)。举例来说,拥有4个汽缸和3个挡位车型的每加仑汽油行驶英里数(mpg)均值为21.5。

结语

本次的R语言语法精讲(三)主要介绍了 R语言的数据处理技术,涉及到很多数据科学常用的数据预处理技术。学完本文后,您将可以完全掌握R语言数据处理与数据分析的能力,并结合R语言语法精讲(一)和R语言语法精讲(二)以及您的专业知识,可以解决大多数数据分析的系统工作,已经可以熟练运用R语言进行数据建模。

既然已经集齐了数据塑形所需的工具,准备好告别第一部分并进入激动人心的数据分析世界了吗!

R 回归 虚拟变量na_R语言实战之R语言基础语法精讲(三)相关推荐

  1. R 回归 虚拟变量na_R语言 | 生存分析之R包survival的单变量和多变量Cox回归

    生存分析之R包survival的单变量和多变量Cox回归续前文生存分析(Survival Analysis). 在前文初步简介了生存分析的概念,以及展示了一种生存分析模型Kaplan-Meier的使用 ...

  2. R 回归 虚拟变量na_工具amp;方法 | R语言机器学习包大全(共45个包)

    机器学习,是一门多学科交叉的人工智能领域的分析技术,它使用算法解析数据,从中学习,然后对世界上的某件事情做出决定或预测. 目前,常见机器学习的研究方向主要包括决策树.随机森林.神经网络.贝叶斯学习和支 ...

  3. r语言 新增一列数字类型_R语言实战之R语言基础语法精讲(一)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具.在学习R数据科学之前,我们首先要对R语言的基础语法有一个良好的了 ...

  4. R 回归 虚拟变量na_互助问答第85期:虚拟变量和空间面板回归问题

    问题一:设置虚拟变量如何做工具变量处理 使用tobit模型回归时,被解释变量为连续变量,解释变量为分类变量,因研究重点需要将分类变量具体分析,因此将解释变量虚拟变量处理,回归时命令为tobit y i ...

  5. R 回归 虚拟变量na_如何优雅地计算多变量

    作者:包寒吴霜 中科院心理所硕士在读(名字/人格/社会/文化心理学) 知乎:https://www.zhihu.com/people/psychbruce 社会科学研究经常会遇到"超多变量& ...

  6. C语言实战:C语言打印九九乘法表

    C语言实战:C语言打印九九乘法表 #include<stdio.h> #include<stdlib.h> #include<Windows.h> int main ...

  7. 爬虫系列一:十天python爬虫基础学习实战第二天——python基础语法

    第一天已经学会了基本的开发环境的安装,今天,可以开始学习如何写代码了,朋友们! 回顾: 1.爬虫能干什么? 2.python环境安装 3.pycharm安装(IDE) 4.简单打印输出hello wo ...

  8. r语言 图形一览_R语言实战(第2版):第三章 图形初阶(01)

    注:如果在头条里面的代码不清楚,可以在""简书""中搜索"康华同学",同步更新!!! 3.1 使用图形 R是一个惊艳的图形构建平台.这里我特 ...

  9. C语言 — 必学的编程基础语法,入门就从这里开始!

    前言 欢迎大家一起来学习C语言,小编会定期更新一些干货. 要说世界上最著名的计算机语言,毫无疑问就是C语言.基本上所有的PC操作系统都有C语言的身影,学习它你可以不用学习过深,但是基础一定要有.现在来 ...

  10. python 语言教程(2)基础语法

    1. 注释 单行注释采用 # # 第一个注释 print ("Hello, Python!") # 第二个注释 name = "Madisetti" # 这是一 ...

最新文章

  1. 与jQuery的感情碰撞——由浅入深学jQuery
  2. 【虚拟机】关于VMware 提示“无法获得VMCI驱动程序的版本:句柄无效”的解决方案...
  3. 想成为一名优秀的Web前端工程师,这5点你要知道
  4. jQuery.获取子节点
  5. 解决java.lang.NoClassDefFoundError: org/apache/log4j/Level
  6. Matrix Transformation codechef 数学题
  7. android解析json数据 no value for message_Hive使用lateral view和explode处理嵌套json
  8. 基于MATLAB小波变换的医学图像分割的研究
  9. stateflow之学习——01
  10. 自组织映射 (SOM) 解决旅行商问题 (TSP)
  11. excel两列数据对比找不同_对比excel,轻松学习python数据分析
  12. VS2019提示“未能完成操作,不支持此接口”
  13. kodexplorer可道云插件之控制台
  14. Golang【sgg】
  15. python+百度AI 文字转换成语音
  16. Elasticsearch压测工具esrally使用笔记
  17. 原神PC端缺少 PCgamesSDK.dll 解决方案
  18. android+如何设置单屏壁纸,给你一个设置单屏壁纸的软件
  19. NVidia Maxwell GPU Tile-based 光栅化模式分析
  20. c语言设计模拟闹钟主函数,基于C5单片机的数字时钟课程设计(C语言,带闹钟)要点.doc...

热门文章

  1. 2021-06-01-HPC-performance-test
  2. PassMark PerformanceTest v10.1.1004 电脑性能测试工具直装版
  3. 如何用u盘给惠普服务器安装系统,如何用u盘装惠普系统教程
  4. c语言网络时间校准,c语言如何建时间校准来和电脑一致?
  5. 计算机考研数学2019,2019计算机考研数学复习:最常遇到的10个问题
  6. TiDB 产品常见问题
  7. 静态资源压缩-nginx缓存问题
  8. [1] Instances as Queries
  9. android播放器(music player)源码分析4(StreamStarter,URLEncoder)
  10. Python人脸笑脸识别【人工智能】【CNN】