R语言数据整理——tidyr包

tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能 tidyr包主要涉及: 1)长宽数据转换;2)列分割与列合并;3)缺失值的简单补齐

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包其他的一些实用功能。


一、gather()函数   https://www.omicsclass.com/article/2014

二、spread()函数  https://www.omicsclass.com/article/2014

三、unit()函数

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


四、separate()函数

在学习了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
  • 发表于 2023-03-24 15:57
  • 阅读 ( 1964 )
  • 分类:R

0 条评论

请先 登录 后评论
星莓
星莓

生物信息工程师

58 篇文章

作家榜 »

  1. omicsgene 698 文章
  2. 安生水 347 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 82 文章
  6. 红橙子 78 文章
  7. rzx 74 文章
  8. CORNERSTONE 72 文章