R语言由浅入深:二、数据处理 r语言:从数据思维到数据实战

   2023-03-08 学习力0
核心提示: 一、变量的创建、编码、命名将数据表示为矩阵或数据框仅是数据准备的第一步,数据分析时,大量的时间都花在了数据处理上1.创建新变量  变量名-表达式2.算数运算符运算符描述+加-减*乘/除^或**求幂x%%y求余(x mod y)   5%%2=1x%/%y整数除法。 5%/%2=23.创

 

一、变量的创建、编码、命名

将数据表示为矩阵或数据框仅是数据准备的第一步,数据分析时,大量的时间都花在了数据处理上

1.创建新变量  变量名<-表达式

2.算数运算符

运算符

描述

+

-

*

/

^或**

求幂

x%%y

求余(x mod y)   5%%2=1

x%/%y

整数除法。 5%/%2=2

3.创建新变量的例子

mydata<-data.frame(x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2
#我们可以看出,在对属性进行操作时都是按照一列一列对应操作的

R语言由浅入深:二、数据处理

4.变量重编码 Recoding Variables

重编码是指根据已有变量创建新变量的过程。

比如:将一个连续型变量变为一组类别值、将误编码的值替换为正确值、基于一组分数创建一个表示及格/不及格的变量

要重编码。可以使用R中的逻辑运算符,返回值为布尔类型

运算符

描述

<

小于

<=

小于或等于

>

大于

>=

大于或等于

==

严格等于

!=

不等于

! x

非x

x | y

x或y

x & y

x和y

isTRUE(X)

测试x是否为TRUE

5.例子:

(1)数据准备(调查问卷)

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

(2)变量重编码

#根据年龄进行分类,重编码  
#[leadership$age > 75] 得到的结果相当于 leadership[c(false,false,false,false,true)]
#选取了值为true的位置的值
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55] <- "Young"

查看处理结果:

R语言由浅入深:二、数据处理

(3)用within()改写

leadership <- within(leadership,{
    agecat <- NA  #先进性初始化
    agecat[age > 75] <- "Elder"
    agecat[age >= 55 & age <= 75] <- "Middle Aged"
    agecat[age < 55] <- "Young" })

如果不用<-赋值回给leadership,则在运行结果为临时值,原leadership不会被改变。

 

6.变量重命名:

(1)fix()可以调用一个交互式的编辑器,单机变量名,然后在弹出的对话框中将其重命名。

例如:fix(leadership)

    注:edit和fix函数的区别

    只用edit(X)在窗口中编辑修改X,关闭窗口后X没有改变,应使用Y<-edit(X);使用fix(X)在窗口只中编辑修改X,关闭窗口后X就是修改后的值,不必使用Y<-fix(X)。

(2)变量重命名方法一:rename()

reshape包中有一个rename()函数,可用于修改变量名。

install.packages("reshape") #先安装包
library(reshape)
leadership <- rename(leadership,
c(manager="managerID", date="testDate") )

(3)变量重命名方法二:names()

#查看所有变量名
names(leadership)
names(leadership)[2] <- "testDate"
#将q1到q5重命名为item1到item5
names(leadership)[6:10] <- c("item1",
"item2", "item3", "item4", "item5")

二、缺失值、日期值处理,数据类型转化,数据排序

1.缺失值

在R中,缺失值以符号NA(Not Available,不可用)表示。不可能出现的值通过符号NaN(Not a Number,非数值)来表示。

(1)检测缺失值是否存在 is.na()

R语言由浅入深:二、数据处理

(2)重编码某些值为缺失值

在之前的示例中,缺失的年龄值被编码为99,任何等于99的年龄值都应该被修改为NA。

leadership$age[leadership$age==99] <- NA

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

①由于含有缺失值的算术表达式和函数的计算结果也是缺失值:需要删除。

 

R语言由浅入深:二、数据处理

②多数的数值函数都有一个na.rm=TRUE选项,在计算过程中略掉NA值

R语言由浅入深:二、数据处理

③na.omit()可以删除所有含缺失数据的行:

newdata <- na.omit(leadership)

2.日期值

通常以字符串的形式输入到R中,然后转化为数值形式存储的日期变量。

函数as.Date()用于执行这种转化。其语法为as.Date(x,"input_format"),其中x是字符型数据,input_format则给出了用于读入日期的适当格式。

(1)日期格式:

符号

含义

示例

%d

数字表示的日期(0~31)

01~31

%a

缩写的星期名

Mon

%A

非缩写星期名

Monday

%m

月份

00~12

%b

缩写的月份

Jan

%B

非缩写的月份

January

%y

两位数的年份

07

%Y

四位数的年份

2007

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

mydates<-as.Date(c("2007-06-22","2004-02-13"))

在leadership数据集中,日期是以mm/dd/yy的格式编码为字符型变量的。需要转化:

leadership$date <- as.Date(leadership$date, "%m/%d/%y")

R语言由浅入深:二、数据处理

(3)返回当天的日期:Sys.Date()

返回当前的日期和时间:date()

输出指定格式的日期值:format(x,format="output_format")

例:

R语言由浅入深:二、数据处理

R语言由浅入深:二、数据处理

R语言由浅入深:二、数据处理 可以看出并没有改变today的值

(4)日期值的相关计算:

R的内部使用自1970年1月1日以来的天数 表示日期,更早的日期表示为负数。可以在日期值上执行算术运算:

startdate <- as.Date("2004-02-13")
enddate <- as.Date("2011-01-22")
days <- enddate - startdate  #默认的是天数表示

计算周数:

difftime(enddate, startdate, units="weeks")

R语言由浅入深:二、数据处理

将日期转化为字符型变量(不常用) 

strDates <- as.character(dates)

3.数据类型转换

R提供了一系列用于判断某个对象的数据类型和将其转换为另一种数据类型的函数。

判断

转换

is.numeric()

as.numeric()

is.character()

as.character()

is.vector()

as.vector()

is.matrix()

as.matrix()

is.data.frame()

as.data.frame()

is.factor()

as.factor()

is.logical()

as.logical()

判断的返回值为TRUE/FALSE

as.datatype()将参数转换为对应类型。

(1)数据类型转换示例:

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

R语言由浅入深:二、数据处理

(2)数据类型转换的用处

①与控制流(如if-then)结合使用时,is.datatype()这样的函数将成为一类强大的工具,即允许根据数据的具体类型以不同 的方式处理数据。

②某些R函数需要接受某个特定类型(字符型或数值型,矩阵或数据框)的数据,as.datatype()这类函数可以在分析之前先行 将数据转换为要求的格式。

4.数据排序

R语言由浅入深:二、数据处理

三、数据集的合并,选取子集,使用SQL操作数据框,数据的整合与重构

1.数据集的合并(Merging)

如果数据分散在多个地方,就需要在进一步分析数据之前先将数据进行合并

(1)添加列(添加变量)

①要横向合并两个数据集,使用merge()函数。两个数据框是通过一个或多个共有变量进行联结的(inner join)。例如

total <- merge(dataframeA, dataframeB, by="ID")

将两个数据框按照ID进行合并

total <- merge(dataframeA, dataframeB, by=c("ID","Country"))

将两个数据框按照两个共有变量ID和Country进行了合并。

直接横向合并,AB

直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,那么可以直接使用cbind()函数(colum bind):

total <- cbind(A, B)

这个函数将横向合并对象A和对象B。为了让它正常工作,每个对象必须拥有相同的行数,且要以相同顺序排序

(2)添加行(添加观测)

纵向合并两个数据框(数据集),使用rbind()函数(row bind)

total <- rbind(dataframeA, dataframeB)

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

①删除dataframeA中的多余变量;

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

2.数据集选取子集

对变量和观测进行保留或删除的方法

(1)选入(保留)变量

从一个大数据集中选择有限数量的变量来 创建一个新的数据集。

数据框中的元素是通过dataframe[row indices, column indices]来访问的。可以沿用这种方法来选择变量。例如:

R语言由浅入深:二、数据处理

选出了6-10列数据

等价于:

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

(2)剔除(丢弃)变量

如果某个变量中有若干缺失值,则需要在进一步分析之前将其丢弃

①方法一:

myvars <- names(leadership) %in% c("q3", "q4")
newdata<-leadership[!myvars]

R语言由浅入深:二、数据处理

选取变量时采用逻辑型向量注意:

leadership[c(TRUE, FALSE, FALSE),]

– 如果行数大于3:会得到1、4、7、10、13、 16……行

leadership[c(TRUE, FALSE),]

– 如果行数大于2:会得到1、3、5、7……行

②方法二:

因为知道q3和q4是第7个和第8个变量(使用-来表示要剔除的数据),也可以使用语句将其剔除:

newdata<-leadership[c(-7,-8)]

③方法三:

leadership$q3 <- leadership$q4 <- NULL

– 注意!:此种方法会直接作用于leadership。

– 此语句实为两句:

• leadership$q3 <- NULL 

• leadership$q4 <- NULL

(3)选入观测

• 选择了第1行到第3行(前三个观测)

newdata <- leadership[1:3,]

• 选择了所有30岁以上的男性

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

R语言由浅入深:二、数据处理

这里记录一下在查询的时候出现的问题:

R语言由浅入深:二、数据处理

没有加上“,”,致使运行的为leadership[c(1,4)],所以得到的是第1,4,6,9列这样一直循环取值

注意“,”一定不能忘掉leadership[c(1,4),]这才是第1,4行

更加清楚地认识到下面的解释:

R语言由浅入深:二、数据处理

(4)subset()函数——最简单的方法

subset函数是选择变量和观测最简单的方法

例,选择所有age值大于等于35或age值小于24的行,保留了变量q1到q4:

R语言由浅入深:二、数据处理

例,选择所有25岁以上的男性,并保留了变量gender到q4和其间所有列:

R语言由浅入深:二、数据处理

(5)随机抽样

在分析数据时,要创建两份随机样本,使用其中一份样本构建预测模型,使用另一份样本验证模型的有效性。

simple()函数能够在数据中(有放回或无放回)抽取大小为n的一个随机样本。

②示例:

R语言由浅入深:二、数据处理

sample()函数中的第一个参数是一个由要从 中抽样的元素组成的向量。在这里,这个向量是1到数据框中观测的数量,第二个参数是要抽取的元素数量,第三个参数表示无放回抽样。

3.使用SQL语句操作数据框

安装sqldf包

install.packages("sqldf")

使用sqldf()函数在数据框上使用SQL中的 SELECT语句。

例:(mtcars数据包含于R的基本安装中)

library(sqldf) 

newdf <- sqldf("select * from mtcars where carb=1 order by mpg")

4.数据的整合和重构

(1)转置:反转行和列,使用函数t()

例:

R语言由浅入深:二、数据处理

使用转置函数

R语言由浅入深:二、数据处理

(2)分类汇总

分类汇总的函数为aggregate(x,by,FUN)

    x是待分类的数据对象;

    by是一个变量名组成的列表,用于对原有观测进行分类

    FUN是用来计算描述性统计量的函数,它将被用来计算新观测中的值

R语言由浅入深:二、数据处理

这个代码意思是:按照变量cyl,gear来分类别,属于相同类的所有数据各个变量取均值(执行FUN函数);group.1和group.2表示了分类值。

注:by中变量必须在一个列表中,即使只有一个变量

(3)reshape包

reshape包是一套整合和重构数据集的万能工具,主要分为melt和cast过程

(4)reshape包的使用示例

①数据准备:

mydata <- read.table(header=TRUE, sep=" ",
text="
ID Time X1 X2
1 1 5 6
1 2 3 5
2 1 6 1
2 2 2 4")

R语言由浅入深:二、数据处理

②melt过程

将数据重构为这样的格式:每个变量独占一行,行中带有要唯一确定这个测量所需的标识符变量。

R语言由浅入深:二、数据处理

③cast过程(好好理解一下

cast()函数读取已融合的数据,并使用你提 供的公式和一个(可选的)用于整合数据 的函数将其重塑。调用格式为:

newdata <- cast(md, formula, FUN)

其中的md为已融合的数据,formula描述了想要的最后结果,而FUN是(可选的)数据整合函数。

例子:

R语言由浅入深:二、数据处理

四、控制流:条件与循环

1.基本概念

语句statement、条件cond、表达式expr、序列seq

2.条件执行结构:

(1) if-else

语法结构:

—if(cond) statement

—if(cond) statement1 else statement2

(2) ifelse

此结构是if-else结构紧凑的向量化版本

语法结构:

—ifelse(cond,statement1,statement2)

(3) switch

语法结构:

switch(expr,...)

例:

feelings<-c("sad","afraid")
for(i in feelings)
  print(
    switch (i,
            happy = "I am glad you are happy",
            afraid = "There is nothing to fear",
            sad = "Cheer up",
            angry = "Calm down now"
    )
  )

输出结果

R语言由浅入深:二、数据处理

(4)for循环

语法结构:for(var in seq) statement

R语言由浅入深:二、数据处理

(5)while循环

语法结构

while (cond) statement

注意:在处理大数据集中的行和列时,R中的循环可能比较低效费时。只要可能,最好联用R中的内建数值/字符处理函数和 apply族函数。

五、用户自定义函数

语法:

R语言由浅入深:二、数据处理

例1:

mysum<-function(x,y){
  z<-x+y
  return(z)
}
mysum(1,5)

R语言由浅入深:二、数据处理

例2:可以为自定义函数设置默认值

#此函数输出当前日期,可让用户选择输出格式,在函数声 明中为参数指定的值将作为其默认值。

mydate <- function(type="long") {

  switch(type,

         long =  format(Sys.time(), "%A %B %d %Y"),

         short = format(Sys.time(), "%m-%d-%y"),

         cat(type, "is not a recognized type\n"))

}

R语言由浅入深:二、数据处理

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 拓端tecdat|R语言VAR模型的不同类型的脉冲响应
    原文链接:http://tecdat.cn/?p=9384目录模型与数据估算值预测误差脉冲响应识别问题正交脉冲响应结构脉冲反应广义脉冲响应参考文献脉冲响应分析是采用向量自回归模型的计量经济学分析中的重要一步。它们的主要目的是描述模型变量对一个或多个变量的冲击的演化
    03-16
  • Visual Studio 编辑R语言环境搭建
    Visual Studio 编辑R语言环境搭建关于Visual Studio 编辑R语言环境搭建具体的可以看下面三个网址里的内容,我这里就讲两个问题,关于r包管理和换本地的r的服务。1.r包管理:Ctrl+72.R本地服务管理:Ctrl+9Visual Studio R官方帮助文档(中文): https://docs
    03-16
  • 拓端tecdat|R语言代写实现向量自回归VAR模型
    原文链接:http://tecdat.cn/?p=8478 澳大利亚在2008 - 2009年全球金融危机期间发生了这种情况。澳大利亚政府发布了一揽子刺激计划,其中包括2008年12月的现金支付,恰逢圣诞节支出。因此,零售商报告销售强劲,经济受到刺激。因此,收入增加了。VAR面临的批
    03-16
  • [译]用R语言做挖掘数据《五》 r语言数据挖掘简
    一、实验说明1. 环境登录无需密码自动登录,系统用户名shiyanlou,密码shiyanlou2. 环境介绍本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序:1. LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令2. GVim:非常好
    03-08
  • 拓端tecdat|Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load(file, DLLpath = DLLpath, ..
    拓端tecdat|Mac系统R语言升级后无法加载包报错
    问题重现:我需要安装R软件包stochvol,该软件包 仅适用于3.6.0版的R。因此,我安装了R(3.6.0 版本),并使用打开它 RStudio。但是现在  ,即使我成功 使用来 安装软件包,也无法加载任何库 。具体来说,我需要加载的库是stochvol  ,Rcpp和 caret
    03-08
  • 拓端数据tecdat|R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据集
    拓端数据tecdat|R语言k-means聚类、层次聚类、
    原文链接:http://tecdat.cn/?p=22838 原文出处:拓端数据部落公众号问题:使用R中的鸢尾花数据集(a)部分:k-means聚类使用k-means聚类法将数据集聚成2组。 画一个图来显示聚类的情况使用k-means聚类法将数据集聚成3组。画一个图来显示聚类的情况(b)部分:
    03-08
  • 《R语言数据挖掘》读书笔记:七、离群点(异常值)检测
    《R语言数据挖掘》读书笔记:七、离群点(异常值
    第七章、异常值检测(离群点挖掘)概述:        一般来说,异常值出现有各种原因,比如数据集因为数据来自不同的类、数据测量系统误差而收到损害。根据异常值的检测,异常值与原始数据集中的常规数据显著不同。开发了多种解决方案来检测他们,其中包括
    03-08
  • 拓端数据tecdat|R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
    拓端数据tecdat|R语言中实现广义相加模型GAM和
    原文链接:http://tecdat.cn/?p=20882  1导言这篇文章探讨了为什么使用广义相加模型 是一个不错的选择。为此,我们首先需要看一下线性回归,看看为什么在某些情况下它可能不是最佳选择。 2回归模型假设我们有一些带有两个属性Y和X的数据。如果它们是线性
    03-08
  • 拓端数据tecdat|R语言时间序列平稳性几种单位根检验(ADF,KPSS,PP)及比较分析
    拓端数据tecdat|R语言时间序列平稳性几种单位根
    原文链接:http://tecdat.cn/?p=21757 时间序列模型根据研究对象是否随机分为确定性模型和随机性模型两大类。随机时间序列模型即是指仅用它的过去值及随机扰动项所建立起来的模型,建立具体的模型,需解决如下三个问题模型的具体形式、时序变量的滞后期以及随
    03-08
  • 拓端tecdat|R语言风险价值VaR(Value at Risk)和损失期望值ES(Expected shortfall)的估计
    拓端tecdat|R语言风险价值VaR(Value at Risk)
    原文链接: http://tecdat.cn/?p=15929 风险价值VaR和损失期望值ES是常见的风险度量。首先明确:时间范围-我们展望多少天?概率水平-我们怎么看尾部分布?在给定时间范围内的盈亏预测分布,示例如图1所示。  图1:预测的损益分布 给定概率水平的预测的分
    03-08
点击排行