R的基本数据管理

我们的掌握目标:

●操纵日期和缺失值

●熟悉数据类型的转换

●变量的创建和重编码

●数据集的排序、合并与取并集

●选入和丢弃变量

一、数据的创建

最开始的示例:



        这个例子很简单,他给出了两个图,一个表示的是数字表示同意的程度;一个表示我们收集的关于五个问题的问答数据。

        我们的目的是:通过这个简单数据集,进行判断男性与女性在听从领导程度上的不同。

        在这里,我们只谈论数据的管理,最开始我们数据的创建。


代码一

结果:

可能出现的错误:

        这个代码中新手最容易犯的错误是data与date 输入错误,倘若将创建列表data.frame()的语句之中不慎将date输成了data,将会出现以下报错。

原因很简单,使用class函数可看出,data是function类型。

二、新变量的创建

新变量的创建及变量的替换:

        在项目研究中,需要对已有的新变量或者现有的变量进行变换,我们的语句是:

                                             变量名 <-  表达式

        在这里,“表达式”是含有多种运算符和函数。

        +               -                    *                    /                   ^(**)                         x%%y                    x%/%y

        加           减                 乘                 除                    求幂                 求余                整数除法

创建新的变量并且合并到原始数据框:

        假设你有一个名为mydata的数据框,其中的变量为x1和x2,现在你想创建一个新变量sumx存储以上两个变量的加和,并创建一个名为meanx的新变量存储这两个变量的均值,将两个新变量整合到原始的数据框中。

第一种方法:

代码二

第二种方法:

代码二

第三种方法;

代码二

可能出现的错误:

        在创建新的变量并且合并到原始数据框可能会出现这两种错误,

            一、直接输入以下代码,会出现报错,原因是因为R并不知道x1和x2来自数据框mydata

代码三

            二、当输入以下代码时,不会出现报错,但是只能创建新的变量,却不能合并到原始数据框

代码三

二、变量的重编码

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

            ●将一个连续型变量修改为一组类别值;

            ●将误编码的值替换为正确值;

            ●基于一组分数线创建一个表示及格/不及格的变量

        这里的意思刚开始有点难懂,所以,后面有个例子,不过在例子之前,我们罗列一下逻辑运算符:

  <              <=               >              >=                 ==                !=            !          |         &         isTURE(x)

小于        小于等于   大于          大于              等于           不等于    非         或     与      测试是否为

接着,进行对连续型变量age进行重编码为agecat(Young、Middle Aged、Elder),先用一个常规的做法:


代码五

        接下来,使用within(),witnin和with类似,不过within 可以允许修改数据框。

代码六

四、变量的重命名

当对现有的名称不满意,可以交互地已编程的方式改变他们。

我们有两种方法:

一、fix(leadership)

二、names(leadership)[2] <- “testDate”  #将testDate替换leadership中的第二个名称。


代码七

结果:


五、缺失值

        数值缺失是不可避免的,

                检测、识别缺失值


代码八


处理缺失值的注意事项

        1、缺失值不可比较,即便是与自身比较

换句话来说,就是无法使用运算符来检测缺失值是否存在

        2、R并不能把无限的或者不可能出现的数值标记为缺失值

                换句话来说,不能标记正无穷之类的以及sin(inf)

重编码某些值为缺失值

在三中已经介绍

在分析中剔除缺失值


代码九

由于x中第三个元素是缺失值,所以y和z都是NA(缺失值)

代码九

使用na.omit()删除不完整观测值

代码十

六、日期值

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

        使用as.Data()函数

        它的语法:as.Date(x,”input_forrmat”)

        其中x是字符型数据,input_forrmat则给出用于读入的日期的适当格式。

        先介绍日期值的输入格式:yyyy-mm-dd

代码十一

        将默认格式的字符型数据转换为对应日期

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

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

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

例如:

接下来还有一些函数:

        difftime()                                                            来计算时间间隔

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

七、类型转换

现有一个数据类型函数的介绍表

          判断类的函数is.datatype返回值是布尔值(0或1),转换的函数as.datatype则是将其将其参数转化为对应类型。


代码十二

七、数据排序

        Order()排序函数,默认升序。排序变量的前面加一个减号。

        创建了一个新的数据集,其中各行依经理人的年龄升序排序

代码十三

创建一个数据集,其中各行依女性到男性、同样性别中按年龄排序

代码十三

创建一个数据集,其中各行依女性到男性、同样性别中按年龄排序

代码十三

九、数据集的合并

数据框中添加列(变量)和行(观测)的方法

添加列:

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

将dataframeA和dataframeB按照ID进行了合并

                #将dataframeA和dataframeB按照ID进行了合并

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

                #将两个数据框按照ID和Country进行了合并

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

cbind()函数:

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

添加

rbind()函数:

         纵向合并两个数据框(数据集),使用两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。

            #纵向合并两个数据框(数据集)

            total <- rbind(dataframeA,dataframeB)

            如果dataframeA中拥有dataframeB中没有的变量,请在合并它们之前做以下某种处理:

                        删除dataframeA中的多余变量;

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

�十、数据集取子集

        选入(保留)变量

代码十四

结果:


剔除(丢弃)变量

        第一种方法:

代码十五

        (1) names(leadership)生成了一个包含所有变量名的字符型向量:c("managerID","testDate","country","gender","age","q1", "q2","q3","q4","q5")。

        (2) names(leadership) %in% c("q3", "q4")返回了一个逻辑型向量,names(leadership)中每个匹配q3或q4的元素的值为TRUE,反之为FALSE:c(FALSE, FALSE, FALSE, FALSE,FALSE, FALSE, FALSE, TRUE, TRUE, FALSE)。

        (3) 运算符非(!)将逻辑值反转:c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE,FALSE, TRUE)。

        (4) leadership[c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,TRUE)]选择了逻辑值为TRUE的列,于是q3和q4被剔除了。

        第二种方法:

代码十五

        在某一列的下标之前加一个减号()就会剔除那一列。

        第三种方法:

代码十五

        将q3和q4两列设为了未定义(NULL)

选入观测


代码十六

        (1)逻辑比较leadership$gender=="M"生成了向量c(TRUE, FALSE, FALSE, TRUE,FALSE)。

        (2)逻辑比较leadership$age > 30生成了向量c(TRUE, TRUE, FALSE, TRUE, TRUE)。

        (3)逻辑比较c(TRUE, FALSE, FALSE, TRUE, TRUE) & c(TRUE, TRUE, FALSE, TRUE,TRUE)生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。

        (4)函数which()给出了向量中值为TRUE元素的下标。因此,which(c(TRUE, FALSE,FALSE, TRUE, FALSE))生成了向量c(1, 4)。

        (5) leadership[c(1,4),]从数据框中选择了第一个和第四个观测。这就满足了我们的选取准则(30岁以上的男性)。

        使用了attach()函数不必在变量名前加上数据框名称。

        希望将研究范围限定在2009年1月1日到2009年12月31日之间收集的观测。


代码十七

        Subset()函数


代码十八

随机抽样

        选择两份随机样本,使用其中一份样本构建预测模型,使用另一份样本验证模型的有效性。一种很常见的建模方法

         sample()函数能够让你从数据集中(有放回或无放回地)抽取大小为n的一个随机样本。

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

        sample()函数会返回随机抽样得到的元素,之后即可用于选择数据框中的行。       


参考文献      R in action

代码:

#代码一

#输入经理人数据

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到q5的评分数据

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)

 

 

 

#代码二

#创建数据框mydata

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

 

 

代码三

#创建数据框mydata

mydata <- data.frame(x1 = c(2,2,6,4),

                     x2 = c(3,4,2,8))

#方法二

attach(mydata)

mydata$sumx <- x1 + x2

mydata$meanx <- (x1+x2)/2

detach(mydata)

 

 

#代码四

#创建数据框mydata

mydata <- data.frame(x1 = c(2,2,6,4),

                     x2 = c(3,4,2,8))

#方法三

mydata <- transform(mydata,

                    sumx = x1 +x2,

                    meanx = (x1 + x2)/2)

 

 

 

#代码五

#输入经理人数据

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到q5的评分数据

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)

#将99岁的年龄值重编码为缺失值

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

#进行对连续型变量age进行重编码为agecat(Young、Middle Aged、Elder)

leadership$agecat[leadership$age > 75] <- "Elder"

leadership$agecat[leadership$age >= 35 &

                    leadership$age <= 75] <- "Middle Aged"

leadership$agecat[leadership$age < 35] <- "Young"

 

#代码六

#输入经理人数据

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到q5的评分数据

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 <- within(leadership,{

  agecat <- NA

  agecat[age > 75]                <- "Elder"

  agecat[age >= 35 & age <= 75]   <- "Middle Aged"

  agecat[age < 35]                <- "Young" })

 

 

#代码七

#输入经理人数据

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到q5的评分数据

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)

names(leadership)

#将testDate替换leadership中的第二个名称。

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

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到q5的评分数据

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)

#识别数据框中的第六列到第十列

is.na(leadership[,6:10])

 

#代码九

x <- c(1,2,NA,3)

y <- x[1]+x[2]+x[3]+x[4]

z <- sum(x)

 

x <- c(1,2,NA,3)

#计算之前去除NA值

y <- sum(x,na.rm=TURE)

 

 

#代码十

#输入经理人数据

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到q5的评分数据

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

#创建newdata,仅包含完整观测值

newdata <- na.omit(leadership)

newdata

 

#代码十一

#简单的输入一个日期,默认格式为yyyy-mm-dd

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

Mydates

 

Sys.Date()

date()

 

#代码十二

#定义a

a <- c(1,2,3)

a

#判断a是不是数值型

is.numeric(a)

#判断a是不是向量

is.vector(a)

#将a转换为字符串型

a <- as.character(a)

a

#判断a是不是数值型

is.numeric(a)

#判断a是不是向量

is.vector(a)

#判断a是不是字符串型

is.character(a)

 

 

#代码十三

 

#对leadership中的age进行排序

newdata <- leadership[order(leadership$age)]

Newdata

 

#创建一个数据集

attach(leadership)

#其中各行依女性到男性、同样性别中按年龄排序

newdata <- leadership[order(gender,age),]

detach(leadership)

 

#创建一个数据集

attach(leadership)

#将各行依经理人的性别和年龄降序排序

newdata <- leadership[order(gender,-age),]

detach(leadership)

 

#代码十四

#从leadership数据框中选择了变量q1、q2、q3、q4和q5,并将它们保存到了数据框newdata

#行下标留空(,)表示默认选择所有行。

#第一种语句

newdata <- leadership[,c(6:10)]

#第二终于语句

myvars <- c("q1","q2","q3","q4","q5")

newdata <- leadership[myvars]

#第三种语句

myvars <- paste("q",1:5,sep="")

newdata <- leadership[myvars]

 

 

#代码十五

myvars <- names(leadership) %in% c("q3","q4")

newdata <- leadership[!myvars]

 

leadership <- leadership <- NULL


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

 

#代码十六

newdata <- leadership[1:3,]

newdata <- leadership[which(leadership$gender=="M"&leadership$age > 30)]

attach(leadership)

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

detach (leadership)

 

#代码十七

#,使用格式mm/dd/yy将开始作为字符值读入的日期转换为日期值

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

#创建开始日期和结束日期

startdate <- as.Date("2009-01-01")

enddata <- as.Date("2009-10-31")

#将研究范围限定在2009年1月1日到2009年12月31日之间收集的观测上

newdata <- leadership[which(leadership$date>=startdate &

                              leadership$date <= enddata),]

 

#代码十八

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

newdata <- subset(leadership,age >= 35 | age <24,

                  select = c(q1,q2,q3,q4))

#选择了所有25岁以上的男性,并保留了变量gender到q4(gender、q4和其

#间所有列)

#冒号运算符from:to表示了数据框中变量from到变量to包含的所有变量

newdata <- subset(leadership,gendar=="M" & age >25,

                  select = gender:q4)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容