tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能
tidyr包主要涉及:
1)长宽数据转换
gather-把宽度较大的数据转换成一个更长的形式,它类比于从reshape2包中融合函数的功能 spread-把长的数据转换成一个更宽的形式,它类比于从reshape2包中铸造函数的功能。 gather()相反的是spread(),前者将不同的列堆叠起来,后者将同一列分开
2)列分割与列合并
separate-将一列按分隔符分割为多列 unite-将多列按指定分隔符合并为一列
3)缺失值的简单补齐
在tidyr包中,有四个常用的函数,分别是:
gather():宽数据转换为长数据,将行聚集成列
spread():长数据转换为宽数据,将列展开为行
unite():多列合并为一列
separate():将一列分离为多列.
之前的文章中已经举例说明过gather和spread的用法,接下来我们主要对unite和separate函数进行详细学习,并在此基础上学习tidyr包其他的一些实用功能。
unite()函数是将数据框中多列合并为一列,调用公式如下:
> unite(data = ,col = ,... = ,sep = ,remove = )
# col:指定组合为新列的名字
# ...:指定数据中哪些列组合在一起
# sep:组合后新列中数据之间的分隔符
# remove:逻辑值,是否保留参与组合的列
# 数据准备
> date <- as.Date('2016-11-01') + 0:29
> hour <- sample(1:24,replace = TRUE,30)
> min <- sample(1:60,replace = TRUE,30)
> second <- sample(1:60,replace = TRUE,30)
> event <- sample(letters,30,replace = TRUE)
> data <- data.frame(date,hour,min,second,event)
> head(data,3)
date hour min second event
1 2016-11-01 23 59 11 y
2 2016-11-02 21 12 4 u
3 2016-11-03 2 55 42 i
在这里,我们使用unite()函数将日期和时间数值合并到一列上。
# date和hour用空格连接
# datehour与时间数值用':'连接
> data %>%
+ unite(datehour,date,hour,sep=' ') %>%
+ unite(datetime,datehour,min,second,sep=':') %>%
+ head(3)
datetime event
1 2016-11-01 23:59:1 y
2 2016-11-02 21:12:4 u
3 2016-11-03 2:55:42 i
在学习了unite()函数后,separate()函数就很好理解了,它的作用正好和unite相反,即将数据框中的某列按照分隔符拆分为多列,一般用于时间序列的拆分,调用公式如下:
> separate(data = ,col = ,into = ,sep = ,remove = ,
+ convert = ,extra = ,fill = ,...)
# col:待拆分的某列
# into:定义拆分后新的列名
# sep:分隔符
# remove:逻辑值,是否删除拆分后的列
我们使用上一节得到的时间数据集,定义为data_unite,并对它进行拆分
# 先拆分日期和时间,在对时间进行细拆分
> data_unite %>%
+ separate(datetime,c('date','time'),sep=' ') %>%
+ separate(time,c('hour','min','second'),sep=':') %>%
+ head(3)
date hour min second event
1 2016-11-01 23 59 1 y
2 2016-11-02 21 12 4 u
3 2016-11-03 2 55 42 i
> library(readxl)
> data <- read_excel('data.xlsx')
> data
# A tibble: 8 × 2
type num
<chr> <dbl>
1 a 75
2 b 72
3 <NA> 66
4 a NA
5 c 69
6 b 65
7 a 72
8 c NA
从上面的数据中,我们可以看到类型与数值都存在缺失值。对于类型的缺失值,我们选择众数替换,对于数值型的缺失值,我们选择均值替换(也可选择中位数等,视具体情况而定)
> num_mean <- mean(data$num, na.rm = TRUE)
> type_mode <- as.character(data$type[which.max(table(data$type))])
> data <- replace_na(data = data, replace = list(num = num_mean,
+ type = type_mode))
> data
# A tibble: 8 × 2
type num
<chr> <dbl>
1 a 75.00000
2 b 72.00000
3 a 66.00000
4 a 69.83333
5 c 69.00000
6 b 65.00000
7 a 72.00000
8 c 69.83333
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!