1. 程式人生 > >R語言資料處理 之 建立新變數

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)