初步的数据处理,通常要创建新的变量。其实,创建新变量可以:
而常创建的新变量有:
可以利用创建表达式来构建新的变量,下面介绍一下R的运算符表达:
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
^ 或者** | 求幂 |
x%%y | 求余 |
x%/%y | 整数除法 |
而创建新变量除了常用的:
data$new_var<- data$x1+data$x4
还有运用transform()函数来构建:
> data<-transform(data,
new1 = (x1+x2)/2,
new2 = x1-x3)
两种方法,各有优点,但第二种方法更加适用于增加多变量的情况。
拿到数据后,第一步是:创建数列(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, ...)
%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
利用逻辑算符,可以返回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
用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
这是一种过滤数据值的简单方法。
> cut function (x, ...) UseMethod("cut") |
> cut2 function (x, cuts, m = 150, g, levels.mean = FALSE, digits, minmax = TRUE, oneval = TRUE, onlycuts = FALSE) |
> factor
function (x = character(), levels, labels = levels, exclude = NA,
ordered = is.ordered(x), nmax = NA)
不止factor(),上述的cut2()也会产生不同分组的因子变量
> 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
}