R语言数据处理 之 创建新变量

发布于:2021-12-03 11:06:46

初步的数据处理,通常要创建新的变量。其实,创建新变量可以:


避开未经处理的数据未有所需数据的难处;变换一些已有数据,以更好的为下一步分析作准备;

而常创建的新变量有:


?缺失值指针 (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")

> 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
}



四、其他常见的转换:整理其中一些如下
abs(x)? : absolute valuesqrt(x) : square rootceiling(x) : ceiling(3.14159) to 4floor(x) : floor(3.14159)to? 4round(x,digits=n) : round(3.14159,digits=2) to 3.14signif ((x,digits=n)) : signif(3.14159,digits=2) to 3.1cox(x), sin(x)......log(x)log2(x),.....exp(x)

相关推荐

最新更新

猜你喜欢