数据科学是一门激动人心的学科,它可以将原始数据转化为认识、见解和知识。本书目的是帮你学习使用 R 语言中最重要的数据科学工具。读完本书后,你将掌握 R 语言的精华,并能够熟练使用多种工具来解决各种数据科学难题。——《R 数据科学》
说实话,我最开始学习 R 语言是从《R 语言实战》开始的。这本书从变量类型、数据结构等基本概念切入,再介绍统计分析方法,最后是高阶技能拓展。这种方式是很考验人的,需要不断地练习代码,但又不知道怎么用。与《R 语言实战》不同,《R 数据科学》,让我们在最短时间内学会数据处理与可视化,其理念就是不谈向量、矩阵、数据框、因子、流程控制等概念,直接从数据地实操入手,尽可能在最短时间内学会数据处理与可视化。
在数据科学中,首先是进行数据导入和整理;然后通过一个反复迭代的过程来理解数据,包括转换、可视化和建模;最后,将处理结果有效地传达给其他人。一旦你导入了数据,最好对其进行整理。整洁的数据意味着,每一列都是一个变量,每一行都是一个观察值。
一旦有了整洁数据,知识生成的两个主要引擎是可视化和建模。数据科学的最后是沟通,这是任何数据分析项目中绝对关键的一部分。如果你无法将结果传达给其他人,那么你对模型和可视化图表的理解再好也没有用。
在所有这些工具周围是编程。编程是一种横跨工具,在数据科学项目的几乎每个部分都会使用。这里有一个大致的80/20规则:可以使用本书中学到的工具解决大约80%的项目,但需要其他工具来解决剩下的20%。其中,tidyverse包可提供非常优秀的数据清理、整合和可视化的“一站式服务”。
tidyverse出自 R 大神Hadley Wickham之手,是他将自己所写的包整理成了一整套数据处理的方法,包括ggplot2,dplyr,tidyr,readr,purrr,tibble,stringr, forcats。这是一套数据分析的逻辑和方法,甚至是一种思想!
########--------数据清洗,10个高频操作--------########
姓名 <- c("张三", "李四", "王五", "赵六")
日期 <- c("2024-10-08", "2024-10-28", "2024-12-01", "2023-10-26")
城市 <- c("北京", "上海", "广州", "深圳")
收入 <- c("8000", "6000", "5000", "10000")
年龄 <- c(32, 45, NA, 39)
性别 <- c("M", "F", "F", "M")
data <- data.frame(姓名, 日期, 城市, 收入, 年龄,性别, stringsAsFactors=FALSE)
library(tidyverse)
## Warning: 程序包'ggplot2'是用R版本4.4.2 来建造的
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)
##
## 载入程序包:'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(lubridate)
# 重命名rename
data <- data %>%
rename(name = 姓名, date = 日期, country = 城市, income = 收入, age = 年龄, gender = 性别)
data <- data %>% clean_names()
# 数据格式转换
data <- data %>%
mutate(income = as.numeric(income),
date = as.Date(date))
# 处理缺失值
data <- data %>%
mutate(age = replace_na(age, mean(age, na.rm = TRUE)))
# 增加新列,mutate
# options(knitr.duplicate.label = "allow")
data <- data %>%
mutate(data, score = income*0.006 + age*0.4)
# 妙用
data <- data %>%
mutate(category = case_when(
income < 6000 ~ "low",
income >= 6000 & income < 8000 ~ "middle",
income >= 8000 ~ "high")
)
# 排序,arrange
data <- data %>%
arrange(gender,score)
data <- data %>%
arrange(gender,desc(score))
# 选取特定列,select
data2 <- data %>%
select(name,income,age,score)
# 筛选特定数据,filter
data2 <- data %>%
filter(gender == "M" & score > 60)
(data2 <- filter(data, gender == "M" & income > 6000))
## name date country income age gender score category
## 1 赵六 2023-10-26 深圳 10000 39 M 75.6 high
## 2 张三 2024-10-08 北京 8000 32 M 60.8 high
# 数据合并,merge
data_merge <- data %>%
left_join(data2, by = "name")
# 删除含有缺失值的行
data_merge <- data_merge %>%
drop_na()