R数据科学-2(tidyr)
2020-10-18 本文已影响0人
jamesjin63
R数据科学-2
是用于清洗数据的工具,如dplyr一样,其中每一列都是变量,每一行都是观察值,并且每个单元格都包含一个值。 “ tidyr”包含用于更改数据集的形状(旋转)和层次结构(嵌套和“取消嵌套”),将深度嵌套的列表转换为矩形数据框(“矩形”)以及从字符串列中提取值的工具。它还包括用于处理缺失值(隐式和显式)的工具。
今天就介绍以下在数据清洗工作时,经常会遇到三个问题:
`1. 宽数据变成长数据(ggplot画图常用)
- 长数据变成宽数据
- 根据值生成重复列数据
`
这些都是为数据画图,或者分析做准备工作。以前是reshape包的内容,当然reshape可以做,但是现在tidyr 处理起来更简洁方便,快速。易于理解。
数据长宽转化
创建一个数据df,然后来进行数据长宽转化实例操作。
image.png
宽数据转成长数据,这里使用gather函数,gathe函数涉及三个参数
gather("key", "value", x, y, z)
library(tidyverse)
# creat data
df=tibble(id=c(1:3),
Shanghai=c(2,5,3),
Beijing=c(12,23,16),
Guangdong=c(7,3,6))
df
# A tibble: 3 x 4
id Shanghai Beijing Guangdong
<int> <dbl> <dbl> <dbl>
1 1 2 12 7
2 2 5 23 3
3 3 3 16 6
## 1. long data
df_a=df %>% gather("Name","value",-id)
df_a
# A tibble: 9 x 3
id Name value
<int> <chr> <dbl>
1 1 Shanghai 2
2 2 Shanghai 5
3 3 Shanghai 3
4 1 Beijing 12
5 2 Beijing 23
6 3 Beijing 16
7 1 Guangdong 7
8 2 Guangdong 3
9 3 Guangdong 6
## 2. wide data
df_a %>% spread("Name",-id)
# A tibble: 3 x 4
id Beijing Guangdong Shanghai
<int> <dbl> <dbl> <dbl>
1 1 12 7 2
2 2 23 3 5
3 3 16 6 3
宽数据转成长数据,这里使用spread函数,spread函数涉及2个参数
df %>% spread(key, value)
重复列变量
有时候会碰到,需要新增一列是重复该变量的多少次,如上述例子中,
上海id=1的有2个,然后重复shanghai2次,5次,3次,形成新增一列。
在tidyr中很简单的uncount函数就可以实现:
uncount(data, weights, .remove = TRUE, .id = NULL)
df_c=df_a %>% filter(!Name=="Beijing")
# Methods 1
df_c %>% uncount(value) %>%
rename(new=Name)
# Methods 2
data.frame(new = rep(df_c$Name,df_c$value))
image.png