【上一篇:42.关于separate()和unite()两个函数】
【下一篇:44.用学到的tidy data整理工具处理tidyr::who数据集】
缺失值的分类
缺失值分为显式缺失和隐式缺失。显式缺失指的是数据中用NA代替的缺失值,隐式缺失指的是不存在于数据中的缺失值。举个例子:
> (stocks <- tibble(
year = c(2015, 2015, 2015, 2015, 2016, 2016, 2016),
qtr = c( 1, 2, 3, 4, 2, 3, 4),
return = c(1.88, 0.59, 0.35, NA, 0.92, 0.17, 2.66)
))
# A tibble: 7 x 3
year qtr return
<dbl> <dbl> <dbl>
1 2015 1 1.88
2 2015 2 0.59
3 2015 3 0.35
4 2015 4 NA
5 2016 2 0.92
6 2016 3 0.17
7 2016 4 2.66
return列的第四行是显示缺失
year=2016,qtr=1对应的return是隐式缺失
明明tibble的结构是一个tidy data,看着也不少什么,为什么还有隐式缺失呢?
个人理解:year列和qtr列的unique values进行组合构成combination
如果combination对应的值没有用NA表示,那就是隐式缺失
隐式缺失变显示
通过下面的变换后形成的表,似乎能理解year和qtr组合的意思了。也似乎可以理解tidy data到底是什么了。
# 分步先看一下
> stocks %>% pivot_wider(names_from = year, values_from = return)
# A tibble: 4 x 3
qtr `2015` `2016`
<dbl> <dbl> <dbl>
1 1 1.88 NA
2 2 0.59 0.92
3 3 0.35 0.17
4 4 NA 2.66
# 最终隐式变显示的结果
> stocks %>%
pivot_wider(names_from = year, values_from = return) %>%
pivot_longer(
cols = c(`2015`, `2016`),
names_to = "year",
values_to = "return",
values_drop_na = FALSE
)
# A tibble: 8 x 3
qtr year return
<dbl> <chr> <dbl>
1 1 2015 1.88
2 1 2016 NA
3 2 2015 0.59
4 2 2016 0.92
5 3 2015 0.35
6 3 2016 0.17
7 4 2015 NA
8 4 2016 2.66
还有一种方法是利用complete()函数,它的原理就是将多个变量一起找unique combination,然后用NA填充缺失的值:
# year和qtr是排列组合的对象
> stocks %>% complete(year, qtr)
# A tibble: 8 x 3
year qtr return
<dbl> <dbl> <dbl>
1 2015 1 1.88
2 2015 2 0.59
3 2015 3 0.35
4 2015 4 NA
5 2016 1 NA
6 2016 2 0.92
7 2016 3 0.17
8 2016 4 2.66
complete()函数的Usage很简单,通过函数的示例数据跑一下很容易理解:
complete(data, ..., fill = list())
data:数据框
...:用于组合的列名,直接用逗号隔开写就可以
fill:对于有缺少值的组合为每个变量提供一个单独的值,而不是NA。
PS:这个感觉好好用的样子!
显示缺失变隐式
将第一个示例里的values_drop_na设为TRUE就可以了:
> stocks %>%
pivot_wider(names_from = year, values_from = return) %>%
pivot_longer(
cols = c(`2015`, `2016`),
names_to = "year",
values_to = "return",
values_drop_na = TRUE
)
# A tibble: 6 x 3
qtr year return
<dbl> <chr> <dbl>
1 1 2015 1.88
2 2 2015 0.59
3 2 2016 0.92
4 3 2015 0.35
5 3 2016 0.17
6 4 2016 2.66
PS:实际上像是删除NA行的样子
一个很有用的替换NA的函数fill()
将NA值用最邻近的值进行替换。
treatment <- tribble(
~ person, ~ treatment, ~response,
"Derrick Whitmore", 1, 7,
NA, 2, 10,
NA, 3, 9,
"Katherine Burke", 1, 4
)
> treatment %>% fill(person)
# A tibble: 4 x 3
person treatment response
<chr> <dbl> <dbl>
1 Derrick Whitmore 1 7
2 Derrick Whitmore 2 10
3 Derrick Whitmore 3 9
4 Katherine Burke 1 4
fill()函数的Usage:
fill(data, ..., .direction = c("down", "up", "downup", "updown"))
data:数据框
...:变量名
.direction:填充方向。down(默认):用上方最近的非NA值填充下方的NA值;
up:用下方最近的非NA填充上方的NA值;
downup:一个非NA值上下方都有NA,则先填下方的NA再上方
updown:与downup相反
【上一篇:42.关于separate()和unite()两个函数】
【下一篇:44.用学到的tidy data整理工具处理tidyr::who数据集】
网友评论