tidyverse高效数据处理

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')
  

你可能感兴趣的:(tidyverse高效数据处理)