title: "tidyverse高效数据处理"
author: "黄天元"
date: "r Sys.Date()
"
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
vignette: >
%\VignetteIndexEntry{Vignette Title}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
使用tidyverse生态系统,简洁高效处理数据
tidyverse是一系列R包的集合,包含了dplyr、ggplot2、tidyr、stringr等,从数据导入预处理,再到高级转化、可视化、建模和展示。
tidyverse是一种代码清晰可读的编程风格,正如英文含义那样,简洁得像诗歌一样。
随机生成一份数据集
nr_of_rows <-2e3
df <- data.frame(
logical = sample(c(TRUE,FALSE,NA),prob = c(0.85,0.1,0.05),nr_of_rows,replace = TRUE),
Integer = sample(1L:100L,nr_of_rows,replace = TRUE),
Real = sample(sample(1:10000,20)/100,nr_of_rows,replace = TRUE),
Factor = as.factor(sample(labels(UScitiesD),nr_of_rows,replace = TRUE))
)
根据生成数据集,完成以下数据操作
1.观察df表格,进行简单描述,然后把它转换为tibble格式,存储在变量dt中,后面的操作在tibble格式的数据表dt中进行。
summary(df)
str(df)
library(pacman)
library(tidyverse)
library(dplyr)
dt <- df %>% as_tibble()
dt
2.筛选Integer小于29的记录。
dt %>%
filter(Integer < 29)
3.筛选Logical为TRUE,而且Integer大于29的记录
dt %>%
filter(logical == 'TRUE',Integer > 29)
4.查看Logical列为缺失值的记录。
dt %>%
filter(is.na(logical))
5.选取表格的前两列,并取出前4行记录。
dt %>%
select(1:2) %>%
slice(1:4)
6.筛选Logical为FALSE的记录,然后选择Real和Factor两列。
dt %>%
filter(logical == 'FALSE') %>%
select(Real,Factor)
7.把表格中的Logical、Integer、Real和Factor这4列分别更名为a、b、c、d,并且进行更新,保存到原来的表格中。
dt %>%
rename(a = logical,b = Integer,c = Real,d = Factor) -> dt #dt数据迭代只能后置写入
dt
8.新增一个名为e的列,让它等于b与c的乘积
dt %>%
mutate(e = b*c)
9.新增一个常数列,名称为one,数值为1
dt %>%
mutate(one =1)
10.让表格根据b和c两列进行升序排序。
dt %>%
arrange(b,c)
11.筛选出a等于TRUE的列,然后根据b进行升序排序
dt %>%
filter(a =='TRUE') %>%
arrange(b)
12.筛选出a等于TRUE的列,然后根据b进行降序排列
dt %>%
filter(a ==TRUE) %>%
arrange(desc(b))
13.查看数据表中哪些变量包含缺失值,缺失值的数量是多少?
dt %>%
transmute_all(is.na) %>%
summarise_all(sum)
14.首先筛选a为FALSE,b大于29的记录,然后选择a、b、c这3列,把b列提取出来放在第一列的位置。
dt %>%
filter(a == FALSE,b > 29) %>%
select(a,b,c) %>%
select(b,everything())
15.求表格中d列有多少条独有的记录
dt %>%
distinct(d)
16.对a列分组,求每一组有多少条记录,然后计算每个分组中分别有多少条独有的d列中的记录。
dt %>%
count(a)
dt %>%
count(a,d)
17.首先根据d列进行分组,然后在组内求c列的平均值
dt %>%
group_by(d) %>%
summarise(mean(c))
18.首先选取a为FALSE的记录,然后根据b和d列进行分组,最后根据分组求c列的平均数和中位数。
dt %>%
filter(a ==FALSE) %>%
group_by(b,d) %>%
summarise(mean(c),median(c))
19.首先选取a为FALSE的记录,然后根据d列进行分组,最后求各个组内c列的最大值和最小值。
dt %>%
filter(a ==FALSE) %>%
group_by(d) %>%
summarise(max(c),min(c))
20.先按照d列进行分组,然后选取b、c、d这3列,新增一列为组内所有c列的数值与在组内第一次出现的c列数值之差。
dt %>%
group_by(d) %>%
select(b,c,d) %>%
mutate(c_new = c-first(c))
21.先筛选a为FALSE的记录,然后选取b、c、d这3列。其后,根据d列进行分组,在组内筛选c列为组内数值最大值和最小值的记录。
然后根据b列进行排序,并在输出的时候要求看到所有记录。
dt %>%
filter(a ==FALSE) %>%
select(b,c,d) %>%
group_by(d) %>%
filter(c==max(c)|c==min(c)) %>%
arrange(b) %>%
print(n = Inf)
22.新增两列,分别根据c列进行升序排名和降序排名。然后根据d列进行分组,选出组内b列的数值为最大的记录。
dt %>%
mutate(rank_c = min_rank(c),rank_c_desc = min_rank(desc(c))) %>%
group_by(d) %>%
filter(b == max(b)) %>%
ungroup()
23.求b列值为最高和最低的5条记录
dt %>%
top_n(5,b)
dt %>%
top_n(5,desc(b))
24.根据d列进行分组,求得每个组的记录个数,形成一个计数表格d_count,然后将dt表格与d_count表格根据d列进行左连接。
dt %>%
count(d) -> d_count1
d_count1
dt %>%
group_by(d) %>%
summarise(n=n()) ->d_count
d_count
dt %>%
left_join(d_count,by='d')