R語言資料處理 之 建立新變數
初步的資料處理,通常要建立新的變數。其實,建立新變數可以:
- 避開未經處理的資料未有所需資料的難處;
- 變換一些已有資料,以更好的為下一步分析作準備;
而常建立的新變數有:
- 缺失值指標 (Missingness indicators) :指出在哪些地方有資料缺失
- 分段數值型資料 ("Cutting Up" quantitative variables):數值型變數對應一些特定值劃分而成的因子變數,是數值型變數對應一些特定值劃分而成的因子變數
- Applying transforms: 對有著特殊分佈的資料進行變換
一、新增新變數
1.1瞭解相關的運算子:
可以利用建立表示式來構建新的變數,下面介紹一下R的運算子表達:
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |
^ 或者** | 求冪 |
x%%y | 求餘 |
x%/%y | 整數除法 |
而建立新變數除了常用的:
data$new_var<- data$x1+data$x4
還有運用transform()函式來構建:
> data<-transform(data,
new1 = (x1+x2)/2,
new2 = x1-x3)
兩種方法,各有優點,但第二種方法更加適用於增加多變數的情況。
·seq()
拿到資料後,第一步是:建立數列(create sequences)。 通常你要做的就是告訴 seq() 數列的最小值和最大值。然後有3種方法可以確定要生成多少個值,一種就是用 by= 命令;另一種方法就是宣告這個數列向量的長度length=;使用 seq(along = x)它就會生成一個和 x 一樣長的向量,其中包含一串連續的序號,你可以用它們來進行遍歷 或者獲取資料集的子集
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
length.out = NULL, along.with = NULL, ...)
1.2新增一個變數來表述該資料中的子集是否存在某變數
%in%用於:建立某種變數,這個變數指示另一個變量出自哪一個子集:
#用大家比較熟悉的入門資料cars來演示一下: > data(cars) > head(cars) speed dist 1 4 2 2 4 10 3 7 4 4 7 22 5 8 16 6 9 10
新增一個新變數來描述車是不是快車(speed>=8)
> cars$fast<-cars$speed %in% c(8,9)
> head(cars$fast)
[1] FALSE FALSE FALSE FALSE TRUE TRUE
> head(cars)
speed dist fast
1 4 2 FALSE
2 4 10 FALSE
3 7 4 FALSE
4 7 22 FALSE
5 8 16 TRUE
6 9 10 TRUE
> table(cars$fast)
FALSE TRUE
48 2
1.3 利用邏輯算符
利用邏輯算符,可以返回T/F 來進行新變數的建立:
< | 小於 |
<= |
小於/等於 |
> | 大於 |
>= | 大於/等於 |
== | 嚴格等於 |
!= | 不等於 |
!x | 不是x |
x|y |
x或y |
isTRUE(x) | 測試x是否為True |
再具體通過演示程式碼來看一下,還是用比較熟悉的mtcars資料來演示:
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
建立一個carbsize來描述分類carb的大小,如下所示:
> mtcars$carbsize[mtcars$carb<4] <-"small"
> mtcars$carbsize[mtcars$carb>=4] <-"big"
> head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb carbsize
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 big
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 big
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 small
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 small
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 small
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 small
1.4建立二進位制變數(binary variables)
用ifelse(),同樣用上面cars來做:
function (test, yes, no)
> cars$slow<-ifelse(cars$speed<=10,T,F)
> table(cars$slow)
FALSE TRUE
41 9
> cars$slow<-ifelse(cars$speed<=10,1,0)
> table(cars$slow)
0 1
41 9
最後 做一張如下的關係表。
> table(cars$slow,cars$speed<=10)
FALSE TRUE
0 41 0
1 0 9
這是一種過濾資料值的簡單方法。
1.5數值型建立類別變數(categorical variables)
> cut function (x, ...) UseMethod("cut") <bytecode: 0x000000000d2a7e00> <environment:namespace:base> |
> cut2 function (x, cuts, m = 150, g, levels.mean = FALSE, digits, minmax = TRUE, oneval = TRUE, onlycuts = FALSE) |
二、因子變數(factor variables)
> factor
function (x = character(), levels, labels = levels, exclude = NA,
ordered = is.ordered(x), nmax = NA)
不止factor(),上述的cut2()也會產生不同分組的因子變數
三、用 mutate() 函式來構建一種新的變數
> library(plyr)
> mutate
function (.data, ...)
{
stopifnot(is.data.frame(.data) || is.list(.data) || is.environment(.data))
cols <- as.list(substitute(list(...))[-1])
cols <- cols[names(cols) != ""]
for (col in names(cols)) {
.data[[col]] <- eval(cols[[col]], .data, parent.frame())
}
.data
}
<environment: namespace:plyr>
四、其他常見的轉換:整理其中一些如下
- abs(x) : absolute value
- sqrt(x) : square root
- ceiling(x) : ceiling(3.14159) to 4
- floor(x) : floor(3.14159)to 4
- round(x,digits=n) : round(3.14159,digits=2) to 3.14
- signif ((x,digits=n)) : signif(3.14159,digits=2) to 3.1
- cox(x), sin(x)......
- log(x)
- log2(x),.....
- exp(x)