R语言统计分析与应用-第三章-1

第三章 基本数据管理

前面讲了一些常用的函数以及数据的输入,在数据处理过程中,在数据输入之后还要对数据进行筛选啊拆分啊什么的,这一章主要讲的就是这个。

下面讲一个例子: 某项研究想确定男性和女性在领导各自企业方式上的不同,主要的问题如下:

  1. 处于管理岗位的男性和女性在听从上级的程度上是否不同;

  2. 这种情况是否依国家不同而不同,或者由性别导致的不同是否普遍存在。

针对这两个问题,让多个国家的经理人的上司对其服从程度打分: 这位经理人在做出决策之前会询问我的意见。

态度 分数
非常不同意 1
不同意 2
中立 3
同意 4
非常同意 5

在这里,每位上司根据这个对某一名经理人进行评分,为简化,一共5个经理人,5个上司。因此,上司的评分就有q1到q5,共5个向量。

manager <- c(1,2,3,4,5)
date <- c("10/20/08","10/21/08","10/10/08","10/19/08","6/1/09")
country <- c("US","UK","US","UK","US")
gender <- c("M","F","M","F","M")
age <- c(32,43,26,38,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,1)
q5 <- c(5,5,2,NA,1)
leader <- data.frame(manager,date,country,gender,age,
                     q1,q2,q3,q4,q5,
                     stringsAsFactors = FALSE)
leader
##   manager     date country gender age q1 q2 q3 q4 q5
## 1       1 10/20/08      US      M  32  5  4  5  5  5
## 2       2 10/21/08      UK      F  43  3  5  2  5  5
## 3       3 10/10/08      US      M  26  3  5  5  5  2
## 4       4 10/19/08      UK      F  38  3  3  4 NA NA
## 5       5   6/1/09      US      M  99  2  2  1  1  1

为从这些数据里分析出东西来,就要对这些数据进行管理。比如;

  1. 5个评分(q1到q5)需要组合起来,即为每位经理人生成一个平均服从程度得分;

  2. 从上面可以看出,有些得分出现了NA缺失值,同时也需要为99岁这样的数据重编码为缺失值,因为99岁这明显不对啊。因此需要一种处理不完整数据的方法;

  3. 在某些数据集中往往包含了数百个变量,而我们可能只对一些感兴趣,因此希望创建一个只包含那些变量的新数据集;

  4. 在本例中,领导行为可能随经理人的年龄而改变,即二者存在某种函数关系。要检验这种观点,需要将当前的年龄数值重编码为类别型的年龄组(比如,年轻,中年,年长);

  5. 领导行为可能随时间推移而发生变化,我们可能想重点研究最近全球金融危机期间的服从行为。那么,需要将研究范围限定在某一个特定的时间段(比如1/1/09到12/31/09)。

这些问题怎么解决呢,下面将一一介绍。

3.1 创建新变量

创建新变量很简单,重点在于如何将新变量整合到原来的数据集中:

y1 <- c(1,2,3,4,5)
y2 <- c(12,13,15,16,17)
newdata <- data.frame(y1,y2)
head(newdata)
##   y1 y2
## 1  1 12
## 2  2 13
## 3  3 15
## 4  4 16
## 5  5 17
#创建新变量
sumy <- newdata$y1+newdata$y2
meany <- (newdata$y1+newdata$y2)/2
sumy
## [1] 13 15 18 20 22
meany
## [1]  6.5  7.5  9.0 10.0 11.0
#可以看出只是创建了新变量,但是不在newdata中
#整合到newdata数据框中
#方法一
newdata1 <- data.frame(newdata, sumy, meany)
head(newdata1)
##   y1 y2 sumy meany
## 1  1 12   13   6.5
## 2  2 13   15   7.5
## 3  3 15   18   9.0
## 4  4 16   20  10.0
## 5  5 17   22  11.0
#方法二
newdata2 <- transform(newdata,
                     sumy=y1+y2,
                     meany=(y1+y2)/2)
head(newdata2)
##   y1 y2 sumy meany
## 1  1 12   13   6.5
## 2  2 13   15   7.5
## 3  3 15   18   9.0
## 4  4 16   20  10.0
## 5  5 17   22  11.0
#方法三
newdata3 <- newdata
attach(newdata3)
## The following objects are masked _by_ .GlobalEnv:
## 
##     y1, y2
newdata3$sumy <- y1+y2
newdata3$meany <- (y1+y2)/2
detach(newdata3)
head(newdata3)
##   y1 y2 sumy meany
## 1  1 12   13   6.5
## 2  2 13   15   7.5
## 3  3 15   18   9.0
## 4  4 16   20  10.0
## 5  5 17   22  11.0

3.2 向量运算

3.2.1 添加或删除向量

在R中,向量一旦建立起来,里面的元素就已经确定了。因此,如果想添加或删除元素,就需要重新给向量赋值。

qwe <- c(12,13,14,23,78)
#在中间添加一个元素,数值56
qwe <- c(qwe[1:3],56,qwe[4:5])
qwe
## [1] 12 13 14 56 23 78

3.2.2 向量运算

这部分就是线性代数的内容。嗯……不讲了。看例子吧

x <- c(2,3,4)
y <- c(2,5,7)
x+y
## [1]  4  8 11
x*y
## [1]  4 15 28

3.2.3 用: 运算符创建向量

:运算符用于生成指定范围内数值构成的向量。 看例子:

5:8
## [1] 5 6 7 8
5:1
## [1] 5 4 3 2 1
#要注意运算符的优先级
i <- 2
#冒号的优先级高于减号,所以先计算i:i,变成个一元向量,然后再减1
i:i-1
## [1] 1
#括号的优先级高于冒号,所以先计算i-1,于是就相当于计算2:1
i:(i-1)
## [1] 2 1

注意了,这个地方书上说的不对,解释的也是乱七八糟。它的结果是: i:i-1的结果是“0 1”,i:(i-1)的结果是“1”。

3.2.4 使用seq()以及rep()函数创建向量

比上面那个冒号“:”运算符更常用的是seq()函数。它用来生成等差数列。

seq(from=10,to=30,by=3)
## [1] 10 13 16 19 22 25 28
?seq()
## starting httpd help server ... done
seq(10,30,3)
## [1] 10 13 16 19 22 25 28

rep()函数可以把同一常数放在向量中,语法是:

rep(x, times, each),前两个参数很好理解,最后的each参数是指定x交替重复的次数。

x <- rep(7,5)
x
## [1] 7 7 7 7 7
y <- rep(c(1,2,3),3)
y
## [1] 1 2 3 1 2 3 1 2 3
rep(1:3,2)
## [1] 1 2 3 1 2 3
rep(c(2,6,12),each=3)
## [1]  2  2  2  6  6  6 12 12 12

3.3 处理数据对象的常用函数

这一部分就不再写了,用的时候自然就知道了。

3.4 变量的重编码

现在解决前言中的问题2: > 2. 从上面可以看出,有些得分出现了NA缺失值,同时也需要为99岁这样的数据重编码为缺失值,因为99岁这明显不对啊。因此需要一种处理不完整数据的方法。

现在将连续型变量age重编码为类别型变量:agecat(Young,Middle Aged,Elder)。

#首先把99岁的年龄值编码成缺失值。
leader$age[leader$age == 99] <- NA
#然后创建agecat向量
leader$agecat[leader$age >= 75] <- "Elder"
leader$agecat[leader$age < 75 & leader$age >=55] <- "Middle Aged"
leader$agecat[leader$age < 55] <- "Young"
leader
##   manager     date country gender age q1 q2 q3 q4 q5 agecat
## 1       1 10/20/08      US      M  32  5  4  5  5  5  Young
## 2       2 10/21/08      UK      F  43  3  5  2  5  5  Young
## 3       3 10/10/08      US      M  26  3  5  5  5  2  Young
## 4       4 10/19/08      UK      F  38  3  3  4 NA NA  Young
## 5       5   6/1/09      US      M  NA  2  2  1  1  1   <NA>

当然这个方法不唯一。

嗯……今天就到这里。

Avatar
Dr.二哈
在读苦逼科研狗

研究方向:脂质营养,业余时间自学R。

相关