R 数据预处理

将若干向量组合为数据框

1
2
3
4
5
6
7
8
> g <- c("a","b","c")
> x <- 1:3
> data <- data.frame(g,x)
> data
g x
1 a 1
2 b 2
3 c 3

从数据框中提取摘要信息

1
2
3
4
> str(data)
'data.frame': 3 obs. of 2 variables:
$ g: Factor w/ 3 levels "a","b","c": 1 2 3
$ x: int 1 2 3

向数据框添加列

1
2
3
4
5
> data$new <- data$x * 2
g x new
1 a 1 2
2 b 2 4
3 c 3 6

从数据框删除列

1
2
3
4
5
> data <- subset(data,select = c(-x,-new))
g
1 a
2 b
3 c

重排序列

1
2
3
4
5
> data2 <-data[c(1,3,2)]
g new x
1 a 2 1
2 b 4 2
3 c 6 3

选取某几列

1
2
3
4
5
> data3 <-data[c("x","new")]
x new
1 1 2
2 2 4
3 3 6

选取某几行

1
2
3
4
> data3 <-data[c(1,2),]
g x new
1 a 1 2
2 b 2 unite 4

连续变量转换为分类变量

1
2
3
4
5
> data$class <- cut(data$new,breaks=c(0,4,8,Inf))
g x new class
1 a 1 2 (0,4]
2 b 2 4 (0,4]
3 c 3 6 (4,8]

宽数据《=》长数据

长数据有一列数据是变量的类型,有一列是变量的值,但不一定只有两列。ggplot2需要长类型的数据,dplyr也需要长类型的数据,大多数的模型(比如lm(), glm()以及gam())也需要长数据。

使用tidyr 包的gather()函数转换到长数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> library(tidyr)
> data
g x new
1 a 1 2
2 b 2 4
3 c 3 6
> data2<-gather(data,key='new_one',value ='count',x,new,-g)
> data2
g new_one count
1 a x 1
2 b x 2
3 c x 3
4 a new 2
5 b new 4
6 c new 6

使用tidyr 包的spread()函数转换到宽数据:

1
2
3
4
5
> spread(data2,key='new_one',value='count')
g x new
1 a 1 2
2 b 2 4
3 c 3 6

多列《=》一列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> data
g x new
1 a 1 2
2 b 2 4
3 c 3 6
> data3<-unite(data,x_new,x,new,sep = '_')
> data3
g x_new
1 a 1_2
2 b 2_4
3 c 3_6

> data4<- separate(data3,x_new,c('x','new'),sep = '_')
> data4
g x new
1 a 1 2
2 b 2 4
3 c 3 6