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

d1fa45caa3cef2bf7064fe44af151c03.png

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

14e3968016af528eeee04c4f464bee73.png

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

c61f6cd71ea593d8d9c7a5fe427c71da.png

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 

c7273fe345ccf0dce13b8b4cd6ccc8c5.png

1.4 变量的重命名

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

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

513f0fc6c3042ca8909711d563215a7c.png

1.5 缺失值

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

(1) 识别缺失值

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

(2) 探索缺失值模式

079975a020ca6ea426b049300dfb76e1.png

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

57ac54bc019aa6f24b4c820141127daf.png

(2.1) 列表显示缺失值

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

library(mice)
md.pattern(leadership)

f19db5aae33b5ca0a996c9150c40287c.png

107d11d21931ab668bcbe54b4c5b6bd0.png

(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) 

12bdc94aad94e439a61979eb116af2ee.png

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

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

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

5fdace2c0fdab1c395ef6c0a7b6a1411.png

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

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

eccaaf125555cd068f79290b60148531.png

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

leadership
newdata <- na.omit(leadership) 
newdata

35decac542ddf959efbb60658fb96a05.png

65f27d7388ec17d11b36f69436b0c19b.png

1.6 日期值

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

1cc20addae51d40b98080fd250dc2c4b.png

日期值的默认输入格式为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

79382a6079cb8e8ba377113b866ae2b3.png

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

Sys.Date()
date()

38630a4d3a12629110519488fa42ac18.png

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

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

1fecf464ada065ce6d8b32f98ea41f93.png

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

strDates <- as.character(dates)

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

strDates <- as.character(today) 
strDates

ab8282b1fb31d42f93a20f2313721674.png

1.7 类型转换

45cf204a7208eeda6b7dda5ba647f557.png
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)

d4a3b3baed3fd097e8fe6d51452c805a.png

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

a3cb9fd3521a5df24ef5797e3f2b94fa.png

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

0aa623697f368c034f3f0f924e513a31.png

(2) 剔除一些变量

newdata 

de01ac05928a5a3f9a9c92aeb3928014.png

(3) 选入观测样本

newdata <- leadership[1:3,] 
newdata

newdata <- leadership[leadership$gender=="M" & 
                      leadership$age > 30,]  
newdata

attach(leadership) 
newdata <- leadership[gender=='M' & age > 30,]  
detach(leadership) 
newdata

60ad9ff3d533e9c8e1164d11711a1b5b.png

使用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

0f5e24b001298b6bd5706624cee858b5.png

(4) 随机抽样

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

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

4663eb2fb2b8a08185c5491a315d0b5a.png

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

2.高级数据管理

2.1 数值和字符处理函数

(1) 数学函数

a2e8e49ddc58c2167137864e9724ee7a.png

5b91a655f7d4732e30af70cb787c4343.png

(2) 统计函数

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

d4c308341db5731b071da93d104e2b3b.png

(3) 概率函数

在R中,概率函数形如 :

[dpqr]distribution_abbreviation()

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

  • d = 密度函数(density)
  • p = 分布函数(distribution function)
  • q = 分位数函数(quantile function)
  • r = 生成随机数(随机偏差)

57c3960ae1dbcd6870110b3cd08ba4f1.png
x <- pretty(c(-3,3), 30) 
y <- dnorm(x) 
plot(x, y, 
  type = "l",  
  xlab = "Normal Deviate", 
  ylab = "Density", 
  yaxs = "i" 
) 

41687507b1e6a590dd4658981da11615.png

设置随机种子:

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

661ee6125a7111eb106d7d64a9786926.png

(4) 字符处理函数

3e9336a931657acad41b71b139e06b6c.png

(5) 其他函数处理

742d43c1aecdd4affd6b263e5f623953.png

(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) 

8c4d8600af6616d849d68aeb71b9044e.png

2.2 整合与重构

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

(1) 转置

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

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

0adac4cf921c1a123142c5b066ba3ca4.png

(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 

338874f2d98b24c5de045d2caf65a5c8.png

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

结语

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值