数据处理 | R-tidyr包

介绍tidyr包中五个基本函数的简单用法:长转宽,宽转长,合并,分割,NA简单填充。

长数据就是一个观测对象可由多行组成,而宽数据则是一个观测仅由一行组成。

#载入所需的R包

library(dplyr)

library(tidyr)

#测试数据集

widedata <- data.frame(person=c('A','B','C'),grade=c(5,6,4),score=c(89,98,90))

widedata

person grade score

1 A 5 89

2 B 6 98

3 C 4 90

一 宽数据转为长数据

gather(): 类似于reshape2包中的melt()函数;

gather(data, key, value, … , na.rm = FALSE, convert = FALSE):

data:需要被转换的宽形表

key:将原数据框中的所有列赋给一个新变量key

value:将原数据框中的所有值赋给一个新变量value

...:可以指定哪些列聚到一列中

na.rm:是否删除缺失值

将示例数据集转成长数据:

longdata <- gather(widedata, variable, value)

longdata

variable value

1 person A

2 person B

3 person C

4 grade 5

5 grade 6

6 grade 4

7 score 89

8 score 98

9 score 90

只把制定变量从宽数据变成长数据的功能,person不变成长数据

gather(widedata, variable, value, -person)

person variable value

1 A grade 5

2 B grade 6

3 C grade 4

4 A score 89

5 B score 98

6 C score 90

gather()函数比reshape2包中melt()函数的优势: 它可以只gather若干列而其他列保持不变:

age <- c(20, 21, 22)

wide <- data.frame(widedata, age)

wide

person grade score age

1 A 5 89 20

2 B 6 98 21

3 C 4 90 22

先对widedata增加一列 age. 整合两个变量之间的若干列, 而保持其他列不变:

long <- gather(wide, variable, value, grade:age)

long

person variable value

1 A grade 5

2 B grade 6

3 C grade 4

4 A score 89

5 B score 98

6 C score 90

7 A age 20

8 B age 21

9 C age 22

二 长数据转为宽数据

spread():类似于reshape2包中的cast()函数;

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

data:为需要转换的长形表

key:需要将变量值拓展为字段的变量

value:需要分散的值

fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

将长数据转成宽数据:

wide <- spread(long, variable, value)

wide

person age grade score

1 A 20 5 89

2 B 21 6 98

3 C 22 4 90

这实际将原来gather后的结果还原为gather前, 但各列的相互位置稍有调整.

三 多列合并为一列

unite(data, col, … , sep = " ")

data::表示数据框,

col:表示合并后的列名称,

… :表示需要合并的若干变量,

sep: = " "用于指定分隔符,

remove:是否删除被组合的列

把widedata中的person,grade, score三个变量合成一个变量information, 并变成"person-grade-score"的格式

wideunite<-unite(widedata, information, person, grade, score, sep= "-")

wideunite

information

1 A-5-89

2 B-6-98

3 C-4-90

四 一列分离为多列.

separate(data, col, into, sep = " ")

data:为数据框

col:需要被拆分的列

into:要拆分为的(多个)列, 通常用c()的形式进行命名

sep : = " " 用于指定分隔符

remove:是否删除被分割的列

用separate函数将上面的wideunite数据框还原:

widesep <- separate(wideunite, information,c("person","grade","score"), sep = "-")

widesep

person grade score

1 A 5 89

2 B 6 98

3 C 4 90

可见separate()函数和unite()函数的功能是相反的.

五 缺失值填充

示例数据集,增加NA值

NAdata <- data.frame(person=c('A','B','C','D'),grade=c(5,NA,4,7),score=c(89,98,NA,89))

NAdata

person grade score

1 A 5 89

2 B NA 98

3 C 4 NA

4 D 7 89

计算x的均值和中位数

x_mean <- mean(NAdata$grade, na.rm = TRUE)

x_median <- median(NAdata$grade, na.rm = TRUE)

计算y的众数

y_mode <- as.character(NAdata

用特定值进行NA填充:

NAdata2 <- replace_na(data = NAdata, replace = list(grade = x_mean, score = y_mode))

NAdata2

person grade score

1 A 5.000000 89

2 B 5.333333 98

3 C 4.000000 89

4 D 7.000000 89

其他数据的预处理方法及缺失值的处理方法,待续 。。。

下一篇
举报

扫码关注云+社区

领取腾讯云代金券