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)
  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值