R语言统计分析与应用-第三章-2
3.5 变量的重命名
继续接上期。上期讲到啥了~~
算了,根据标题来。这一节主要讲如何修改变量的名称。一般来说,可以通过交互式或者编程的方法来实现。
假设希望将变量名manager变为managerID。
#fix(leader)
#在弹出的界面单击manager就可以修改了
上面是交互式修改,下面介绍如何用命令行修改。
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)
#首先调用reshape包
library(reshape)
#修改manager和date变量名
#这里书上出现了个错误。managerID应该用双引号括起来
leader <- rename(leader, c(manager="managerID",
date="testDate"))
leader
## managerID testDate 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
#也可以通过names()函数来重命名变量
#比如讲q1-q5变为item1-item5
names(leader)[6:10] <- c("item1","item2","item3",
"item4","item5")
leader
## managerID testDate country gender age item1 item2 item3 item4 item5
## 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
嗯,就这么简单。
3.6 缺失值
说起缺失值,很烦的好不好。在实际的数据处理中,经常会遇到缺失值的出现。有些是因为某些样本并没有这个变量(指标),也有些是因为测量过程中出现问题导致的。
缺失值的存在对后续的数据处理是个很大的问题。在R中,缺失值用NA表示。可以用函数is.na()检测缺失值是否存在。它将返回逻辑值。出现NA就用TRUE,反之则是FALSE。看下面的例子。
x <- c(1,2,NA,3,4)
is.na(x)
## [1] FALSE FALSE TRUE FALSE FALSE
现在将这个函数应用在leader数据框上:
is.na(leader[6:10])
## item1 item2 item3 item4 item5
## [1,] FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE FALSE FALSE
## [4,] FALSE FALSE FALSE TRUE TRUE
## [5,] FALSE FALSE FALSE FALSE FALSE
那么问题来了,现在已经检测到缺失值了,要怎么处理呢?
第一种方法是删除这些缺失值,用其余的数据进行之后的运算
#先构建几个向量
a <- c(1,NA,2,3,4)
b <- c(10,20,NA,30,40)
z <- a+b
z
## [1] 11 NA NA 33 44
d <- a[1]+a[2]+a[3]+a[4]+a[5]
d
## [1] NA
e <- sum(a)
e
## [1] NA
#可以看出e算不出来,在sum函数中加入na.rm=TRUE删掉缺失值
e <- sum(a,na.rm = TRUE)
也可以用函数na.omit()来移除所有含有缺失值的观测,也就是变量,它将删除所有含有缺失值的行。
leader
## managerID testDate country gender age item1 item2 item3 item4 item5
## 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
newdata <- na.omit(leader)
newdata
## managerID testDate country gender age item1 item2 item3 item4 item5
## 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
## 5 5 6/1/09 US M 99 2 2 1 1 1
可以看见少了两行。要注意的是,这个函数尽量不要用,因为它作用太强了。
那么问题又来了,不能用这个函数,还能用什么呢。
在其他地方看到,可以用填补法把缺失值填上去(不影响原有数据的分布)。不过现在忘了在哪里看到了,等有空了再补上。
3.8 类型转换
嗯,我就是跳过了3.7节,也就是日期值的内容。有兴趣的话自己去看看吧。
类型转换包括数值型、字符型等的互转,数据框、矩阵等的互转。见下表。
判断 | 转换 |
---|---|
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() |
一般来说,先判断类型,再根据需求转换。例子我就不举了,以后会用到。 算了,讲一个吧。
xyz <- c(2,4,5,6,7)
is.numeric(xyz)
## [1] TRUE
is.vector(xyz)
## [1] TRUE
is.character(xyz)
## [1] FALSE
xyz <- as.character(xyz)
is.numeric(xyz)
## [1] FALSE
is.vector(xyz)
## [1] TRUE
is.character(xyz)
## [1] TRUE
3.9 数据排序
排序嘛,很好理解。举个栗子。
#用order()函数
newdata1 <- leader[order(leader$age)]
newdata1
## country managerID gender testDate age
## 1 US 1 M 10/20/08 32
## 2 UK 2 F 10/21/08 43
## 3 US 3 M 10/10/08 26
## 4 UK 4 F 10/19/08 38
## 5 US 5 M 6/1/09 99
或者
attach(leader)
## The following objects are masked _by_ .GlobalEnv:
##
## age, country, gender
newdata2 <- leader[order(gender,age)]
newdata2
## gender testDate country managerID age
## 1 M 10/20/08 US 1 32
## 2 F 10/21/08 UK 2 43
## 3 M 10/10/08 US 3 26
## 4 F 10/19/08 UK 4 38
## 5 M 6/1/09 US 5 99
3.10 数据集的合并
说实话,我觉得应该先讲数据集的拆分,不过无所谓了。
数据集的合并可以看成在原来的数据集上添加行或者列。多数情况下,两个数据框是通过一个或多个共有变量进行联结的,叫做内联结(inner join)。 merge()函数是用来横向合并数据集的,即列合并。
total <- merge(dataframe1,datafame2,by=“ID”)
下面看下具体的例子。
library(multilevel)
## 载入需要的程辑包:nlme
## 载入需要的程辑包:MASS
data(cohesion)
cohesion
## UNIT PLATOON COH01 COH02 COH03 COH04 COH05
## 1 1044B 1ST 4 5 5 5 5
## 2 1044B 1ST 3 NA 5 5 5
## 3 1044B 1ST 2 3 3 3 3
## 4 1044B 2ND 3 4 3 4 4
## 5 1044B 2ND 4 4 3 4 4
## 6 1044B 2ND 3 3 2 2 1
## 7 1044C 1ST 3 3 3 3 3
## 8 1044C 1ST 3 1 4 3 4
## 9 1044C 2ND 3 3 3 3 3
## 10 1044C 2ND 2 2 2 3 2
## 11 1044C 2ND 1 1 1 3 3
#现在新建一个数据框group.size
group.size <- data.frame(
UNIT=c("1044B","1044B","1044C","1044C"),
PLATOON=c("1ST","2ND","1ST","2ND"),
PSIZE=c(3,3,2,3)
)
group.size
## UNIT PLATOON PSIZE
## 1 1044B 1ST 3
## 2 1044B 2ND 3
## 3 1044C 1ST 2
## 4 1044C 2ND 3
new.cohesion <- merge(cohesion,group.size,
by=c("UNIT","PLATOON"))
new.cohesion
## UNIT PLATOON COH01 COH02 COH03 COH04 COH05 PSIZE
## 1 1044B 1ST 4 5 5 5 5 3
## 2 1044B 1ST 3 NA 5 5 5 3
## 3 1044B 1ST 2 3 3 3 3 3
## 4 1044B 2ND 3 4 3 4 4 3
## 5 1044B 2ND 4 4 3 4 4 3
## 6 1044B 2ND 3 3 2 2 1 3
## 7 1044C 1ST 3 3 3 3 3 2
## 8 1044C 1ST 3 1 4 3 4 2
## 9 1044C 2ND 3 3 3 3 3 3
## 10 1044C 2ND 2 2 2 3 2 3
## 11 1044C 2ND 1 1 1 3 3 3
那么,纵向合并也就是行合并怎么弄呢。用rbind()函数。
total <- rbind(dataframe1,datafame2)
注意一点,两个数据框必须拥有相同的变量,顺序倒是无所谓。如果A数据框含有B数据框没有的变量,那么就采取下面两种方法: 1. 将它删除;
- 在B中追加这个变量并将其值设置为NA。
3.11 数据集取子集
这节的内容就是在解决第三章开头的第5个问题。
在实际操作中,经常会出现导入的数据集包含了太多样本以及变量,而仅仅只想针对某些样本或者变量来展开研究。下面一一介绍取子集的方法。
3.11.1 选入样本
见例子:
data(cohesion)
cohesion
## UNIT PLATOON COH01 COH02 COH03 COH04 COH05
## 1 1044B 1ST 4 5 5 5 5
## 2 1044B 1ST 3 NA 5 5 5
## 3 1044B 1ST 2 3 3 3 3
## 4 1044B 2ND 3 4 3 4 4
## 5 1044B 2ND 4 4 3 4 4
## 6 1044B 2ND 3 3 2 2 1
## 7 1044C 1ST 3 3 3 3 3
## 8 1044C 1ST 3 1 4 3 4
## 9 1044C 2ND 3 3 3 3 3
## 10 1044C 2ND 2 2 2 3 2
## 11 1044C 2ND 1 1 1 3 3
#选择第一到第三行并命名为newdata3数据集
#注意方括号的用法"[行, 列]"
newdata3 <- cohesion[1:3,]
#按条件筛选
#注意绝对等于“==”以及连接符“&”
newdata4 <- cohesion[which(cohesion$UNIT=="1044B"
&
cohesion$COH03>=4),]
当然,这个方法不唯一,subset()函数也可以。
3.11.2 选入变量
同样见例子。
data(cohesion)
cohesion
## UNIT PLATOON COH01 COH02 COH03 COH04 COH05
## 1 1044B 1ST 4 5 5 5 5
## 2 1044B 1ST 3 NA 5 5 5
## 3 1044B 1ST 2 3 3 3 3
## 4 1044B 2ND 3 4 3 4 4
## 5 1044B 2ND 4 4 3 4 4
## 6 1044B 2ND 3 3 2 2 1
## 7 1044C 1ST 3 3 3 3 3
## 8 1044C 1ST 3 1 4 3 4
## 9 1044C 2ND 3 3 3 3 3
## 10 1044C 2ND 2 2 2 3 2
## 11 1044C 2ND 1 1 1 3 3
#选择cohesion数据集中第一个到第三个变量,也就是列
newdata5 <- cohesion[1:3]
newdata5
## UNIT PLATOON COH01
## 1 1044B 1ST 4
## 2 1044B 1ST 3
## 3 1044B 1ST 2
## 4 1044B 2ND 3
## 5 1044B 2ND 4
## 6 1044B 2ND 3
## 7 1044C 1ST 3
## 8 1044C 1ST 3
## 9 1044C 2ND 3
## 10 1044C 2ND 2
## 11 1044C 2ND 1
#等价于
v <- c("UNIT","PLATOON","COH01")
newdata6 <- cohesion[v]
newdata6
## UNIT PLATOON COH01
## 1 1044B 1ST 4
## 2 1044B 1ST 3
## 3 1044B 1ST 2
## 4 1044B 2ND 3
## 5 1044B 2ND 4
## 6 1044B 2ND 3
## 7 1044C 1ST 3
## 8 1044C 1ST 3
## 9 1044C 2ND 3
## 10 1044C 2ND 2
## 11 1044C 2ND 1
3.11.3 剔除变量
捡栗子,不对,见例子:
myvariable <- names(cohesion) %in%
c("COH01","COH03","COH05")
newdata7 <- cohesion[!myvariable]
newdata7
## UNIT PLATOON COH02 COH04
## 1 1044B 1ST 5 5
## 2 1044B 1ST NA 5
## 3 1044B 1ST 3 3
## 4 1044B 2ND 4 4
## 5 1044B 2ND 4 4
## 6 1044B 2ND 3 2
## 7 1044C 1ST 3 3
## 8 1044C 1ST 1 3
## 9 1044C 2ND 3 3
## 10 1044C 2ND 2 3
## 11 1044C 2ND 1 3
下面讲解一下: >names(cohesion)产生一个包含所有变量名的字符向量
names(cohesion) %in% c(“COH01”,“COH03”,“COH05”)返回一个逻辑向量,names(cohesion)中每个匹配这三个变量的元素的值为TRUE,反之为FALSE。即c(FALSE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE)
运算符非(即“!”)将逻辑值翻转即c(TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE)
cohesion[c(TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE)]选了TRUE的列。
于是COH01,COH03,COH05被删除了。 当然也可以根据这三个变量的位置来操作。
newdata8 <- cohesion[c(-3,-5,-7)]
newdata8
## UNIT PLATOON COH02 COH04
## 1 1044B 1ST 5 5
## 2 1044B 1ST NA 5
## 3 1044B 1ST 3 3
## 4 1044B 2ND 4 4
## 5 1044B 2ND 4 4
## 6 1044B 2ND 3 2
## 7 1044C 1ST 3 3
## 8 1044C 1ST 1 3
## 9 1044C 2ND 3 3
## 10 1044C 2ND 2 3
## 11 1044C 2ND 1 3
3.11.4 subset()函数
前面提到了这个函数,举个例子:
newdata9 <- subset(cohesion, COH02>=4 | COH02<=1,
select=c(COH01,COH02,COH03,COH04,COH05))
newdata9
## COH01 COH02 COH03 COH04 COH05
## 1 4 5 5 5 5
## 4 3 4 3 4 4
## 5 4 4 3 4 4
## 8 3 1 4 3 4
## 11 1 1 1 3 3
newdata10 <- subset(cohesion, UNIT=="1044B" & COH02>=4,
select=c(COH01,COH02,COH03,COH04,COH05))
newdata10
## COH01 COH02 COH03 COH04 COH05
## 1 4 5 5 5 5
## 4 3 4 3 4 4
## 5 4 4 3 4 4
嗯,这章就结束了。