变量预处理的三种方法:
举例:中国5个省份的GNP,消费和人口的数据如下
省份 | GNP(亿元) | 消费(亿元) | 人口(万) |
---|---|---|---|
A省 | 6000 | 5000 | 2000 |
B省 | 7200 | 5800 | 3600 |
C省 | 7400 | 6000 | 3500 |
D省 | 11000 | 10200 | 5020 |
E省 | 9200 | 8500 | 6100 |
首先读入数据。
> cons <- c(5000,5800,6000,10200,8500)
> pop <- c(2000,3600,3500,5020,6100)
> gnp <- c(6000,7200,7400,11000,9200)
现在,加入我们要得到人均GNP和人均储蓄的指标。
第一种方法:对现有的指标直接进行运算变换。
> pgnp <- gnp/pop
> psave <- (gnp-cons)/pop
第二种方法:用transform()函数进行变换。
> data <- data.frame(gnp, cons, pop)
> transform(data,pgnp=gnp/pop,psave=(gnp-cons)/pop)
gnp cons pop pgnp psave
1 6000 5000 2000 3.000000 0.5000000
2 7200 5800 3600 2.000000 0.3888889
3 7400 6000 3500 2.114286 0.4000000
4 11000 10200 5020 2.191235 0.1593625
5 9200 8500 6100 1.508197 0.1147541
第三种方法:用with() 函数进行变换。该函数的用法是with(data, expr, ...),表示对data执行expr运算。
> (pgnp <- with(data,gnp/pop))
[1] 3.000000 2.000000 2.114286 2.191235 1.508197
> (psave <- with(data,(gnp-cons)/pop))
[1] 0.5000000 0.3888889 0.4000000 0.1593625 0.1147541
你知道还有哪些对数据的函数吗?请留言补充。
变量重编码的三种方法
对变量进行重编码是在数据预处理中经常会遇到的一个问题。例如:
-
将连续性变量进行分组,变成一个离散型变量。
-
将某个值替换成另一个值。
要重编码可以使用R中的一个或者多个逻辑运算符,逻辑运算符返回的结果为TRUE或FALSE。 R中常用的逻辑运算符如下表所示。
运算符 | 说明 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 严格等于 |
!= | 不等于 |
!x | 非X |
X&Y | X和Y |
X|Y | X或Y |
例如,以MASS包中的Cars93数据为例,该数据是关于不同汽车制造商不同款式的汽车价格等数据, 共有27个变量。现在假如我们只关心制造商和价格变量
> library(MASS)
> data("Cars93")
> dat <- data.frame(manu=Cars93$Manufacturer, price=Cars93$Price)
> head(dat)
manu price
1 Acura 15.9
2 Acura 33.9
3 Audi 29.1
4 Audi 37.7
5 BMW 30.0
6 Buick 15.7
由于价格的数据是连续型数值变量,假如我们打算将价格按照(0,12)、(12,20)、(20,max(price))分成“cheap”、“okay”和“expensive” 三种类型。
第一种方法是利用[ ] 将price 分成不同的取值区间,然后用“cheap”、“okay”和“expensive”分别进行替换。
> dat$pricegrade <- NA
> dat$pricegrade[dat$price >=20] <- "expensive"
> dat$pricegrade[dat$price >=12 & dat$price <20] <- "okay"
> dat$pricegrade[dat$price <12 ] <- "cheap"
> head(dat)
manu price pricegrade
1 Acura 15.9 okay
2 Acura 33.9 expensive
3 Audi 29.1 expensive
4 Audi 37.7 expensive
5 BMW 30.0 expensive
6 Buick 15.7 okay
第二种方法是使用within()函数,该函数与with()用法相似, 不同的是该函数可以对数据框进行修改。
> dat <- data.frame(manu=Cars93$Manufacturer, price=Cars93$Price)
> dat <- within(dat,{
pricegrade <- NA
pricegrade[price>=20] <- "expensive"
pricegrade[price>=12 & dat$price<20] <- "okay"
pricegrade[price <12] <- "cheap"
})
> head(dat)
manu price pricegrade
1 Acura 15.9 okay
2 Acura 33.9 expensive
3 Audi 29.1 expensive
4 Audi 37.7 expensive
5 BMW 30.0 expensive
6 Buick 15.7 okay
第三种方法是利用cut()函数先将连续取值的price分为三个区间,然后再利用levels()函数将不同的区间用“cheap”、“okay”和“expensive”分别进行命名。
> dat <- data.frame(manu=Cars93$Manufacturer, price=Cars93$Price)
> dat$pricegrade <- cut(dat$price,c(0,12,20,max(dat$price)))
> levels(dat$pricegrade) <- c("cheap","okay","expensive")
> head(dat)
manu price pricegrade
1 Acura 15.9 okay
2 Acura 33.9 expensive
3 Audi 29.1 expensive
4 Audi 37.7 expensive
5 BMW 30.0 expensive
6 Buick 15.7 okay
另外,car包中的recode()函数提供了非常方便的重编码方法。
例如我们需要对前面的三种类型粉刺额替换成“A”、“B”和“C”。
> install.packages("car")
> library(car)
> recode(dat$pricegrade,"'cheap'='A';'okay'='B';'expensive'='C'")
[1] B C C C C B C C C C C B A B B B B B C B B C A A B B B C B B A A A B B B C C A B B B B A A A B C C C C C A A B B
[57] C C C B B A C A B B C B B B C B A A B B C C A A A B A A B B C A B B C C C
Levels: A B C
变量重命名的三种方法:
方法一,使用交互式编辑器。
在命令敞口输入fix(data),R会自动调用一个交互式的编辑器,单击变量名,然后再弹出的对话框中将其重命名,如下图:
image.png方法二: reshape包中有一个rename()函数,可用于修改变量名。其调用格式为:
rename( dataframe, c(oldname1= "newname1", oldname2 = "newname2", ... ))
例如,将上面的例子中的dat中的pricegrade重命名为grade。
> install.packages("reshape")
> library(reshape)
> dat1 <- rename(dat, c(pricegrade="grade"))
> head(dat1)
manu price grade
1 Acura 15.9 okay
2 Acura 33.9 expensive
3 Audi 29.1 expensive
4 Audi 37.7 expensive
5 BMW 30.0 expensive
6 Buick 15.7 okay
方法三:直接通过names() 函数来重命名变量。例如:
> names(dat)
[1] "manu" "price" "pricegrade"
> names(dat)[3] <- "grade"
> head(dat)
manu price grade
1 Acura 15.9 okay
2 Acura 33.9 expensive
3 Audi 29.1 expensive
4 Audi 37.7 expensive
5 BMW 30.0 expensive
6 Buick 15.7 okay
方法三较为简单,常用。
网友评论