【免责声明:本文用于教学】
05. 数据处理
一、数据框创建新变量
假设有MyData数据框,其中变量为x1,x2. 现创建名为sumx和meanx的新变量,分别存储变量x1与x2的加和与均值。
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)
二、变量的重命名
在处理数据和数据分析过程中,我们可能需要修改变量名。例如,由于R处理变量标签的能力有限,一种常见的解决方法是将变量标签作为变量名,然后通过位置下标来访问这个变量。修改变量名有以下几种常见方式。
1. 用交互式编辑器
若修改数据集x的变量名,键入函数fix(x),即可打开交互式编辑器界面。
> score<-data.frame(student=c("A","B","C","D"),gender=c("M","M","F","F"),math=c(90,70,80,60),Eng=c(88,78,69,98),pl=c(66,59,NA,88))
> fix(score)
> score.list<-as.list(score) #将score转化为列表
> fix(score.list)
(1)若数据集为矩阵或数据框
将打开“数据编辑器”,单击要修改的变量名,在弹出的“变量编辑器”修改即可:
(2)若数据集为列表
将交互式编辑器为一个记事本,只需修改“.Names”之后对应的变量名即可:
2. 用函数rename()
reshape包中的函数rename(),用来修改数据库和列表的变量名,但不能修改矩阵的变量名,基本格式为:
rename(x, c(oldname="newname",...))
其中,oldname为原变量名,newname为新变量名。
library(reshape)
> rename(score,c(pl="chinese"))
student gender math Eng chinese
1 A M 90 88 66
2 B M 70 78 59
3 C F 80 69 NA
4 D F 60 98 88
> rename(score.list,c(pl="chinese"))
$student
[1] A B C D
Levels: A B C D
$gender
[1] M M F F
Levels: F M
$math
[1] 90 70 80 60
$Eng
[1] 88 78 69 98
$chinese
[1] 66 59 NA 88
注意:原数据集中的变量名并未被修改。
3. 用函数names()
和rename()一样可用来修改数据框和列表的变量名,不能修改矩阵的变量名;区别在于:names()会在原数据集中修改变量名。
其基本格式为:
names(x)[i]<- "newname"
> names(score)[5]="chinese"
> score
student gender math Eng chinese
1 A M 90 88 66
2 B M 70 78 59
3 C F 80 69 NA
4 D F 60 98 88
4. 用函数colnames()和rownames()
用来修改矩阵的变量名(行名和列名),也能修改数据框的行名和列名。基本格式为:
rownames(x)[i]<- "newname"
> colnames(score)[5]="Chinese"
> score
student gender math Eng Chinese
1 A M 90 88 66
2 B M 70 78 59
3 C F 80 69 NA
4 D F 60 98 88
> rownames(score)=letters[1:4]
> score
student gender math Eng Chinese
a A M 90 88 66
b B M 70 78 59
c C F 80 69 NA
d D F 60 98 88
三、变量的重新编码
例如,数据集Leader中连续型变量age重新编码为分类型变量rankAge (Young、Middle Aged、Elder)。【数据集缺失】
首先,必须把99岁的年龄值重新编码为缺失值:
Leader$age[Leader$age == 99] <-NA
然后创建rankAge变量:
Leader$rankAge[Leader$age>75] <- "Elder"
Leader$rankAge[Leader$age>=50 & Leader$age <=75] <- "Middle Aged"
Leader$rankAge[Leader$age<50] <- "Young"
或者
Leader<-within(Leader, {
rankAge<-NA
rankAge[age>75] <- "Elder"
rankAge[age>=50 & age<=75]<-"Middle Aged"
rankAge[age<50] <- "Young"})
四、数据排序
1.函数sort(),基本