R: 4.3.2 (2023-10-31) R studio: 2023.12.1+402 (2023.12.1+402)

1. Customer Lifetime Value (CLV)

1.1 The Marketing Problem

我们需要了解我们的客户,或者知道某个特定的客户是否与我们的组织相关。因此:

  • 我们想知道客户为组织创造了多少价值。
  • 我们想知道生成的价值将如何演变。
  • 我们希望根据价值对客户进行细分。这样我们就可以针对不同的客户群体执行特定的操作。

1.2 Customer Lifetime Value (CLV)

解决业务问题的技术是理解客户的价值。我们有很多方法来了解客户的价值。其中最相关的之一是客户生命周期价值(CLV)。

创建一个仅包含固定酸度大于或等于8的葡萄酒的数据框。创建一个仅包含品质为7的葡萄酒的数据框。创建一个仅包含2列(pH和品质)的数据框。创建一个仅包含2列(pH和品质)的数据框,其中葡萄酒按照pH的升序排序。创建一个仅包含2列(pH和品质)的数据框,其中葡萄酒按照品质的降序排序。创建一个仅包含没有柠檬酸的葡萄酒的数据框,并按照品质的降序排序。创建一个红葡萄酒数据集的版本,其中包含一个额外的列,该列包含酒精含量乘以密度。创建一个总结红葡萄酒数据集中每个变量的数据框。CLV 是企业与客户整个关系中获得的所有价值的预测。所有客户生成的价值称为客户权益,用于评估公司。

主要概念。影响客户价值的因素很多,在 CLV 计算中必须考虑其中的一些:

  • 现金流:客户与组织的关系期间对组织产生的收入的净现值。
  • 生命周期:与组织的关系持续的时间。
  • 维护成本:确保每位客户的收入流量的相关成本。
  • 风险成本:与客户相关的风险。
  • 获取成本:获取新客户所需的成本和努力。
  • 保留成本:保留新客户所需的成本和努力。
  • 推荐价值:客户在其影响范围内对公司收入的推荐影响。
  • 细分改进:客户信息在改进客户细分模型中的价值。

CLV

$$ CLV = \sum_{t=0}^{T} \frac{(p_t - c_t) r_t}{(1 + i)^t} - AC $$

其中,

  • $p_t$ 表示时间 $t$ 客户支付的价格,
  • $c_t$ 表示时间 $t$ 的客户服务直接成本,
  • $i$ 表示公司的折现率或资金成本。
  • $r$ 表示客户在时间 $t$ 返回购买或保持活跃的概率,
  • $AC$ 表示获取客户的成本,
  • $T$ 表示用于估算客户生命周期价值(CLV)的时间范围。

A simplification

让我们假设 $ p $ 和 $ c $ 是常数值,而 $ r $ 是随时间递减的函数,那么公式如下所示:

$$ CLV = \sum_{t=0}^{\infty} \frac{m \cdot r^t}{(1 + i)^t} - AC = m \cdot \left( \frac{r}{1 + i - r} \right) - AC $$

其中,$ p - c = m $ 表示利润,$ r $ 表示保留率,$ i $ 表示折现率。

最终考虑:

  • 通常,我们会为公式中的每个概念拥有一个数据集。
  • 我们需要估计其余的数值。
  • 因此,重要的是要记住:我们对未来的预测能力受到我们过去经验的限制。

1.3 Implementation Process and Use Cases

实施过程如下所示:

  • 讨论 CLV 是否适合作为我们业务的指标
  • 辨别和理解数据源和元数据
  • 提取、转换、清理和加载数据
  • 选择 CLV 方法
  • 分析结果并调整参数
  • 展示并解释结果

CLV常用于:

  • 基于CLV制定市场战略
  • 基于CLV的客户细分
  • 跨段落进行预测和客户演变分析
  • 基于CLV创建不同的沟通、服务和忠诚计划
  • 唤醒“非活跃”客户
  • 估算公司的价值(在收购情况下,例如初创公司)

1.4 ARPU/ARPA as CLV approximation

平均用户收入(ARPU)或平均账户收入(ARPA)可用于计算历史CLV。 过程如下:

  • 计算每位客户每月的平均收入(即总收入/客户加入的月份数)
  • 将它们相加
  • 乘以12或24以获得一年或两年的CLV。

练习:假设Josep和Laura是您唯一的客户,他们的购买情况如下:

Customer Name Purchase Date Amount
Josep Jan 1, 2023 $150
Josep May 1, 2023 $45
Josep May 15, 2023 $50
Laura Jun 15, 2023 $100
Laura Jun 15, 2023 $75
Laura Jun 30, 2023 $100

假设今天是2023年7月1日。

Josep的平均每月收入是 (150 + 50 + 100) / 6 = 50,

Laura的平均每月收入是 (45 + 75 + 100) / 2 = 110。

将这两个数字相加,得到每位客户的平均月收入为 160 / 2 = 80。要找到12个月或24个月的CLV,将该数字乘以12或24。

ARPU方法的好处是计算简单,但它没有考虑到客户行为的变化。

1.5 How to implement CLV in R

> CLV.df <- read_excel("Data_CLV.xlsx", sheet = "Ex2") 

> CLV.df
# A tibble: 7 × 6
t active p c i r
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 200 375 20 0.01 0.91
2 2 165 375 20 0.01 0.825
3 3 150 375 20 0.01 0.75
4 4 176 375 20 0.01 0.88
5 5 178 375 20 0.01 0.89
6 6 150 375 20 0.01 0.75
7 7 135 375 20 0.01 0.675

  • t:表示时间,通常表示观察期的长度或预测的时间段。它可以以天、月、年等为单位。

  • active:表示客户是否活跃。在 CLV 模型中,通常将客户分为活跃客户和不活跃客户,根据他们在观察期内的购买行为或者活动频率进行分类。

  • p:表示客户购买或者消费的总额。它是客户在观察期内购买的产品或服务的总额度,也称为客户价值。

  • c:表示客户获取或者留存的成本。这包括了获取新客户的营销成本、维护现有客户的成本以及服务客户的成本等。

  • i:表示折现率或贴现率。在 CLV 模型中,通常使用折现率来考虑时间价值的概念,即未来收入的现值。

  • r:表示留存率。它是指客户在一段时间内继续购买产品或服务的概率,通常作为客户流失的相反概率。

1.5.1 Exploratory Data Analysis

> summary(CLV.df)
t active p c i r
Min. :1.0 Min. :135.0 Min. :375 Min. :20 Min. :0.01 Min. :0.6750
1st Qu.:2.5 1st Qu.:150.0 1st Qu.:375 1st Qu.:20 1st Qu.:0.01 1st Qu.:0.7500
Median :4.0 Median :165.0 Median :375 Median :20 Median :0.01 Median :0.8250
Mean :4.0 Mean :164.9 Mean :375 Mean :20 Mean :0.01 Mean :0.8114
3rd Qu.:5.5 3rd Qu.:177.0 3rd Qu.:375 3rd Qu.:20 3rd Qu.:0.01 3rd Qu.:0.8850
Max. :7.0 Max. :200.0 Max. :375 Max. :20 Max. :0.01 Max. :0.9100

摘要显示价格和成本是恒定的。活跃客户的范围是[135,200]。保留率的范围是[0.83,1.11]。

客户演变。我们可以创建一条折线图来了解客户数量的变化情况。 ggplot() 用于构建初始绘图对象,并几乎总是紧跟着 + 添加组件到图中。

Active Customer Evolution

ggplot(CLV.df, aes(x = t, y = active)) +
geom_line() + ylab("Customer") +
xlab("Period") + ggtitle("Active Customer Evolution")

Retention Ratio Evolution

ggplot(CLV.df, aes(x = t, y = r)) + geom_line() + ylab("Customer") + xlab("Period") +
ggtitle("Retention Ratio Evolution")

问题:我们观察到了什么?由于一些变量是恒定的,CLV只取决于客户数量。图表与之前的类似。

1.5.2 Calculate CLV

现在,我们可以计算(历史)CLV。首先,我们创建一个新的列,其中包含每个时期的CLV:

> CLV.df$CLV <- (CLV.df$p-CLV.df$c)*CLV.df$r^CLV.df$t/(1+CLV.df$i)^CLV.df$t 

> CLV.df
# A tibble: 7 × 7
t active p c i r CLV
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 200 375 20 0.01 0.91 320.
2 2 165 375 20 0.01 0.825 237.
3 3 150 375 20 0.01 0.75 145.
4 4 176 375 20 0.01 0.88 205.
5 5 178 375 20 0.01 0.89 189.
6 6 150 375 20 0.01 0.75 59.5
7 7 135 375 20 0.01 0.675 21.1

CLV演变。现在我们创建一个图表来看看CLV的变化:

ggplot(CLV.df, aes(x = t, y = CLV)) + geom_line() + ggtitle("CLV evolution") + ylab("CLV") + xlab("Period")

CLV evolution

问题:我们观察到了什么?由于一些变量是恒定的,CLV只取决于客户数量。图表与之前的类似。

> CLV <- apply(CLV.df, 2, sum) 

> CLV[7]
CLV
1175.932

问题:这个值代表什么意思?CLV值代表了客户的生命周期价值,即客户在其与公司的整个关系中为公司带来的预期收益总和。这个值可以帮助公司评估客户的重要性,并为营销策略和资源分配提供指导。

1.6 Exercise:

如果保留率恒定为0.80会发生什么呢?

  • 解决方案

首先,我们可以添加一个新的列:

CLV.df$CLV2 <- (CLV.df$p - CLV.df$c) * 0.8 / (1 + CLV.df$i)^(CLV.df$t - 1)

然后,我们可以创建一个新的图表:

ggplot(CLV.df, aes(x = t, y = CLV2)) + geom_line() + ylab("CLV2") + xlab("Period") + labs(title = "CLV 2 Evolution")

最后,我们可以计算CLV值:

> CLV <- apply(CLV.df, 2, sum) 

> CLV[7]
CLV
1175.932

> CLV[8]
CLV2
1929.915

CLV[7] 代表了我们在分析中所考虑的时间段内的 CLV 值,通常表示了一个时间段的结束。例如,如果我们在分析中考虑的是过去一年的数据,则 CLV[7] 就表示了过去一年的客户生命周期价值。

CLV[8] 则代表了在 CLV[7] 时间段之后的 CLV 值,通常表示了一个新的时间段的开始。例如,如果我们想要预测未来一年的客户生命周期价值,则 CLV[8] 就表示了未来一年的预期 CLV 值。

2 Data Manipulation

需要安装dplyr包。获取dplyr的最简单方法是安装tidyverse:install.packages("tidyverse")。 tidyverse是一组设计用于数据科学的R包。所有的包都共享一个基础设计理念、语法和数据结构。核心tidyverse包括以下几个:

  • ggplot2是一个用于声明性创建图形的系统。
  • dplyr提供数据操作的语法,提供一组一致的动词,解决最常见的数据操作挑战。
  • tidyr提供了一组函数,帮助您将数据整理成整洁的形式。整洁的数据是具有一致形式的数据:简言之,每个变量都放在一列中,每列都是一个变量。
  • readr提供了一种快速友好的方式来读取矩形数据(例如csv、tsv和fwf)
  • stringr提供了一组连贯的函数,旨在使处理字符串变得尽可能简单。
  • forcats提供了一组有用的工具,解决了因子(分类变量)的常见问题
  • purr
  • tibble

或者,只安装dplyr:install.packages("dplyr", dependencies=TRUE)。Dependencies = TRUE将安装此包所需的依赖项。

让我们加载包和数据集。mtcars数据集随dplyr包一起提供。我们可以使用这些包来探索数据。

mtcars

> head(mtcars) 
mpg cyl disp hp drat wt qsec vs am gear
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3
carb
Mazda RX4 4
Mazda RX4 Wag 4
Datsun 710 1
Hornet 4 Drive 1
Hornet Sportabout 2
Valiant 1

> str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...

2.1 Manipulate cases

  • filter() 函数根据其值选择案例。
> filter(mtcars, gear == 4) # 过滤器可与所有标准逻辑运算符一起使用
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

> filter(mtcars, gear == 3 | gear == 4) # 即 >、<、=>、<=、!=、==
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

> filter(mtcars, mpg > 21)
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
  • arrange() 函数按照选定列的值对数据框的行进行排序。
> arrange(mtcars, gear)
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8

> arrange(mtcars, gear, mpg)
mpg cyl disp hp drat wt qsec vs am gear carb
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2

> arrange(mtcars, desc(mpg)) # desc 以降序排序
mpg cyl disp hp drat wt qsec vs am gear carb
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4

2.2 Manipulate variables

  • select() 函数根据变量名选择变量。
> select(mtcars, gear, mpg, hp)
gear mpg hp
Mazda RX4 4 21.0 110
Mazda RX4 Wag 4 21.0 110
Datsun 710 4 22.8 93
Hornet 4 Drive 3 21.4 110
Hornet Sportabout 3 18.7 175
Valiant 3 18.1 105
Duster 360 3 14.3 245
Merc 240D 4 24.4 62
Merc 230 4 22.8 95
Merc 280 4 19.2 123
Merc 280C 4 17.8 123
Merc 450SE 3 16.4 180
Merc 450SL 3 17.3 180
Merc 450SLC 3 15.2 180
Cadillac Fleetwood 3 10.4 205
Lincoln Continental 3 10.4 215
Chrysler Imperial 3 14.7 230
Fiat 128 4 32.4 66
Honda Civic 4 30.4 52
Toyota Corolla 4 33.9 65
Toyota Corona 3 21.5 97
Dodge Challenger 3 15.5 150
AMC Javelin 3 15.2 150
Camaro Z28 3 13.3 245
Pontiac Firebird 3 19.2 175
Fiat X1-9 4 27.3 66
Porsche 914-2 5 26.0 91
Lotus Europa 5 30.4 113
Ford Pantera L 5 15.8 264
Ferrari Dino 5 19.7 175
Maserati Bora 5 15.0 335
Volvo 142E 4 21.4 109

> select(mtcars, -drat) # - 符号表示删除变量/列
mpg cyl disp hp wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 2.780 18.60 1 1 4 2
  • slice() 函数根据行号选择特定的行。
> slice(mtcars, 1:3)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
  • sample_n() 和 sample_frac() 函数选择随机行:
> sample_n(mtcars, 5) # 选择的行数
mpg cyl disp hp drat wt qsec vs am gear carb
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1

> sample_frac(mtcars, .1) # 选择的行数占总行数的比例
mpg cyl disp hp drat wt qsec vs am gear carb
Merc 230 22.8 4 140.8 95 3.92 3.150 22.9 1 0 4 2
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.0 1 0 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.9 1 1 4 1
  • mutate() 函数添加新变量,这些变量是现有变量的函数。
> mutate(mtcars, wt_mpg = wt * mpg)
mpg cyl disp hp drat wt qsec vs am gear carb wt_mpg
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 55.0200
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 60.3750
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 52.8960
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 68.8010
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 64.3280
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 62.6260
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 51.0510
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 77.8360
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 71.8200
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 66.0480
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 61.2320
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 66.7480
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 64.5290
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 57.4560
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 54.6000
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 56.4096
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 78.5715
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 71.2800
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 49.0960
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 62.2065
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 52.9975
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 54.5600
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 52.2120
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 51.0720
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 73.8240
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 52.8255
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 55.6400
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 45.9952
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 50.0860
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 54.5690
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 53.5500
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 59.4920

> mutate(mtcars, mpg_mean = mean(mpg), mpg_diff_mean = mpg - mpg_mean)
mpg cyl disp hp drat wt qsec vs am gear carb mpg_mean mpg_diff_mean
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 20.09062 0.909375
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 20.09062 0.909375
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 20.09062 2.709375
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 20.09062 1.309375
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 20.09062 -1.390625
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 20.09062 -1.990625
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 20.09062 -5.790625
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 20.09062 4.309375
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 20.09062 2.709375
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 20.09062 -0.890625
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 20.09062 -2.290625
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 20.09062 -3.690625
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 20.09062 -2.790625
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 20.09062 -4.890625
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 20.09062 -9.690625
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 20.09062 -9.690625
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 20.09062 -5.390625
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 20.09062 12.309375
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 20.09062 10.309375
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 20.09062 13.809375
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 20.09062 1.409375
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 20.09062 -4.590625
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 20.09062 -4.890625
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 20.09062 -6.790625
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 20.09062 -0.890625
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 20.09062 7.209375
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 20.09062 5.909375
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 20.09062 10.309375
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 20.09062 -4.290625
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 20.09062 -0.390625
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 20.09062 -5.090625
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 20.09062 1.309375

> mutate(mtcars, mpg_mean_diff = mpg - mean(mpg))
mpg cyl disp hp drat wt qsec vs am gear carb mpg_mean_diff
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 0.909375
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 0.909375
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 2.709375
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 1.309375
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 -1.390625
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 -1.990625
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 -5.790625
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 4.309375
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 2.709375
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 -0.890625
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 -2.290625
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 -3.690625
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 -2.790625
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 -4.890625
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 -9.690625
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 -9.690625
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 -5.390625
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 12.309375
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 10.309375
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 13.809375
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 1.409375
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 -4.590625
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 -4.890625
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 -6.790625
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 -0.890625
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 7.209375
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 5.909375
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 10.309375
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 -4.290625
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 -0.390625
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 -5.090625
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 1.309375

2.3 Summarise cases

summarise() 函数创建一个新的数据框。它将有一行总结所有观察结果,并包含每个您指定的摘要统计量的一个列。如果有分组变量,它将为每个分组变量的组合创建一行。

> summarise(mtcars, sd(disp))
sd(disp)
1 123.9387

> summarise(mtcars, median(mpg), mean(mpg), max(mpg), min(mpg))
median(mpg) mean(mpg) max(mpg) min(mpg)
1 19.2 20.09062 33.9 10.4

2.4 Group cases

使用 group_by() 函数创建表的一个“分组”副本。dplyr函数将分别处理每个“组”,然后将结果组合起来。

> group_by(mtcars, cyl)
# A tibble: 32 × 11
# Groups: cyl [3]
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# ℹ 22 more rows
# ℹ Use `print(n = ...)` to see more rows

2.5 管道操作符 %>%

允许您将一个函数的输出直接发送到下一个函数的输入。使用管道操作符时,请记住以下几点:

  1. 第一个参数始终是一个数据框。
  2. 后续参数指定对数据框要执行的操作。
  3. 参数的顺序将返回一个新的数据框(除非您通过分配操作(如使用“<-”)对第一个参数中的数据框进行了更改)。
> mtcars %>% # take dataframe, then
+ group_by(gear) %>% # group it by gear, then
+ summarise(mean(mpg)) # summarise the mean mpg for each level o .... [TRUNCATED]
# A tibble: 3 × 2
gear `mean(mpg)`
<dbl> <dbl>
1 3 16.1
2 4 24.5
3 5 21.4

> mtcars %>%
+ filter(mpg > 21) %>% select(gear, mpg, hp) %>% arrange(gear)
gear mpg hp
Hornet 4 Drive 3 21.4 110
Toyota Corona 3 21.5 97
Datsun 710 4 22.8 93
Merc 240D 4 24.4 62
Merc 230 4 22.8 95
Fiat 128 4 32.4 66
Honda Civic 4 30.4 52
Toyota Corolla 4 33.9 65
Fiat X1-9 4 27.3 66
Volvo 142E 4 21.4 109
Porsche 914-2 5 26.0 91
Lotus Europa 5 30.4 113

如果您想要使用这个较小版本的数据创建一个新的对象,可以通过为它指定一个新名称来实现:

> mtcars_mpg <- mtcars %>% filter(mpg > 21) %>% select(gear, mpg, hp) %>% arrange(gear)

> mtcars_mpg
gear mpg hp
Hornet 4 Drive 3 21.4 110
Toyota Corona 3 21.5 97
Datsun 710 4 22.8 93
Merc 240D 4 24.4 62
Merc 230 4 22.8 95
Fiat 128 4 32.4 66
Honda Civic 4 30.4 52
Toyota Corolla 4 33.9 65
Fiat X1-9 4 27.3 66
Volvo 142E 4 21.4 109
Porsche 914-2 5 26.0 91
Lotus Europa 5 30.4 113

2.6 Excercise

> redwine <- read.csv("Data_redwine.csv", header=TRUE) 

> head(redwine)
fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density pH sulphates alcohol quality
1 7.4 0.70 0.00 1.9 0.076 11 34 0.9978 3.51 0.56 9.4 5
2 7.8 0.88 0.00 2.6 0.098 25 67 0.9968 3.20 0.68 9.8 5
3 7.8 0.76 0.04 2.3 0.092 15 54 0.9970 3.26 0.65 9.8 5
4 11.2 0.28 0.56 1.9 0.075 17 60 0.9980 3.16 0.58 9.8 6
5 7.4 0.70 0.00 1.9 0.076 11 34 0.9978 3.51 0.56 9.4 5
6 7.4 0.66 0.00 1.8 0.075 13 40 0.9978 3.51 0.56 9.4 5
  1. 创建一个仅包含固定酸度大于或等于8的葡萄酒的数据框。
> wines_fixed_acidity_8_or_greater <- redwine %>%
+ filter(fixed.acidity >= 8)

> wines_fixed_acidity_8_or_greater
fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density pH sulphates alcohol quality
1 11.2 0.280 0.56 1.9 0.075 17 60 0.99800 3.16 0.58 9.8 6
2 8.9 0.620 0.18 3.8 0.176 52 145 0.99860 3.16 0.88 9.2 5
3 8.9 0.620 0.19 3.9 0.170 51 148 0.99860 3.17 0.93 9.2 5
4 8.5 0.280 0.56 1.8 0.092 35 103 0.99690 3.30 0.75 10.5 7
5 8.1 0.560 0.28 1.7 0.368 16 56 0.99680 3.11 1.28 9.3 5
6 8.9 0.220 0.48 1.8 0.077 29 60 0.99680 3.39 0.53 9.4 6
7 8.5 0.490 0.11 2.3 0.084 9 67 0.99680 3.17 0.53 9.4 5
8 8.3 0.655 0.12 2.3 0.083 15 113 0.99660 3.17 0.66 9.8 5
3 12.0 0.380 0.56 2.1 0.093 6 24 0.99925 3.14 0.71 10.9 6
  1. 创建一个仅包含品质为7的葡萄酒的数据框。
> # 使用filter函数筛选品质为7的葡萄酒
> redwine_quality_7 <- redwine %>%
+ filter(quality == 7)

> # 显示新数据框的前几行
> head(redwine_quality_7)
fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density pH sulphates alcohol quality
1 7.3 0.65 0.00 1.2 0.065 15 21 0.9946 3.39 0.47 10.0 7
2 7.8 0.58 0.02 2.0 0.073 9 18 0.9968 3.36 0.57 9.5 7
3 8.5 0.28 0.56 1.8 0.092 35 103 0.9969 3.30 0.75 10.5 7
4 8.1 0.38 0.28 2.1 0.066 13 30 0.9968 3.23 0.73 9.7 7
5 7.5 0.52 0.16 1.9 0.085 12 35 0.9968 3.38 0.62 9.5 7
6 8.0 0.59 0.16 1.8 0.065 3 16 0.9962 3.42 0.92 10.5 7
  1. 创建一个仅包含2列(pH和品质)的数据框。
# 使用select函数选择指定的两列
redwine_selected_columns <- redwine %>%
select(pH, quality)

# 显示新数据框的前几行
head(redwine_selected_columns)
  1. 创建一个仅包含2列(pH和品质)的数据框,其中葡萄酒按照pH的升序排序。
> # 使用select函数选择指定的两列,然后使用arrange函数按照pH的升序排序
> redwine_selected_and_sorted <- redwine %>%
+ select(pH, quality) %>%
+ arrange(pH)

> # 显示新数据框的前几行
> head(redwine_selected_and_sorted)
pH quality
1 2.74 4
2 2.86 6
3 2.87 6
4 2.88 8
5 2.89 5
6 2.89 5
  1. 创建一个仅包含2列(pH和品质)的数据框,其中葡萄酒按照品质的降序排序。
> # 使用select函数选择指定的两列,然后使用arrange函数按照品质的降序排序
> redwine_selected_and_sorted <- redwine %>%
+ select(pH, quality) %>%
+ arrange(desc(quality))

> # 显示新数据框的前几行
> head(redwine_selected_and_sorted)
pH quality
1 3.35 8
2 3.23 8
3 3.56 8
4 2.88 8
5 3.22 8
6 3.15 8
  1. 创建一个仅包含没有柠檬酸的葡萄酒的数据框,并按照品质的降序排序。
> # 使用filter函数筛选没有柠檬酸的葡萄酒,然后使用arrange函数按照品质的降序排序
> redwine_no_citric_acid <- redwine %>%
+ filter(citric.acid == 0) %>%
+ arrange(desc(quality))

> # 显示新数据框的前几行
> head(redwine_no_citric_acid)
fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density pH sulphates alcohol quality
1 7.3 0.650 0 1.2 0.065 15 21 0.99460 3.39 0.47 10.0 7
2 5.1 0.585 0 1.7 0.044 14 86 0.99264 3.56 0.94 12.9 7
3 4.9 0.420 0 2.1 0.048 16 42 0.99154 3.71 0.74 14.0 7
4 5.6 0.660 0 2.2 0.087 3 11 0.99378 3.71 0.63 12.8 7
5 5.6 0.660 0 2.2 0.087 3 11 0.99378 3.71 0.63 12.8 7
6 7.8 0.645 0 2.0 0.082 8 16 0.99640 3.38 0.59 9.8 6
  1. 创建一个红葡萄酒数据集的版本,其中包含一个额外的列,该列包含酒精含量乘以密度。
# 使用mutate函数创建一个新列,该列为酒精含量乘以密度
redwine_with_extra_column <- redwine %>%
mutate(alcohol_density = alcohol * density)

# 显示新数据框的前几行
head(redwine_with_extra_column)
  1. 创建一个总结红葡萄酒数据集中每个变量的数据框。
> # 使用summary函数对红葡萄酒数据集进行总结
> redwine_summary <- summary(redwine)

> # 显示总结结果
> redwine_summary
fixed.acidity volatile.acidity citric.acid residual.sugar chlorides free.sulfur.dioxide total.sulfur.dioxide density pH sulphates alcohol quality
Min. : 4.600 Min. :0.1200 Min. :0.0000 Min. : 1.200 Min. :0.01200 Min. : 1.00 Min. : 6.00 Min. :0.9906 Min. :2.740 Min. :0.3300 Min. : 8.40 Min. :3.000
1st Qu.: 7.400 1st Qu.:0.4000 1st Qu.:0.1200 1st Qu.: 2.000 1st Qu.:0.07200 1st Qu.: 7.00 1st Qu.: 23.00 1st Qu.:0.9964 1st Qu.:3.190 1st Qu.:0.5600 1st Qu.: 9.50 1st Qu.:5.000
Median : 8.300 Median :0.5200 Median :0.2800 Median : 2.300 Median :0.08100 Median :13.00 Median : 39.00 Median :0.9973 Median :3.300 Median :0.6200 Median : 9.90 Median :5.000
Mean : 8.729 Mean :0.5283 Mean :0.2946 Mean : 2.579 Mean :0.09037 Mean :15.17 Mean : 48.33 Mean :0.9973 Mean :3.299 Mean :0.6685 Mean :10.24 Mean :5.594
3rd Qu.: 9.800 3rd Qu.:0.6350 3rd Qu.:0.4700 3rd Qu.: 2.700 3rd Qu.:0.09300 3rd Qu.:20.25 3rd Qu.: 64.25 3rd Qu.:0.9984 3rd Qu.:3.400 3rd Qu.:0.7400 3rd Qu.:10.80 3rd Qu.:6.000
Max. :15.900 Max. :1.3300 Max. :1.0000 Max. :15.500 Max. :0.61100 Max. :68.00 Max. :165.00 Max. :1.0032 Max. :3.900 Max. :2.0000 Max. :14.90 Max. :8.000

3. Code

library("readxl") # used for report compilation and table display 
library("ggplot2") # confusion matrix
library("dplyr") # confusion matrix

# 获取当前已加载文件的目录
file_dir <- dirname(parent.frame(2)$ofile)
print(file_dir)
# 将工作目录设置为当前已加载文件的目录
setwd(file_dir)

CLV.df <- read_excel("Data_CLV.xlsx", sheet = "Ex2")
CLV.df

summary(CLV.df)

ggplot(CLV.df, aes(x = t, y = active)) +
geom_line() + ylab("Customer") +
xlab("Period") + ggtitle("Active Customer Evolution")

ggplot(CLV.df, aes(x = t, y = r)) + geom_line() + ylab("Customer") + xlab("Period") +
ggtitle("Retention Ratio Evolution")

CLV.df$CLV <- (CLV.df$p-CLV.df$c)*CLV.df$r^CLV.df$t/(1+CLV.df$i)^CLV.df$t
CLV.df

ggplot(CLV.df, aes(x = t, y = CLV)) + geom_line() + ggtitle("CLV evolution") + ylab("CLV") + xlab("Period")

CLV <- apply(CLV.df, 2, sum)
CLV[7]

CLV.df$CLV2 <- (CLV.df$p - CLV.df$c) * 0.8 / (1 + CLV.df$i)^(CLV.df$t - 1)

ggplot(CLV.df, aes(x = t, y = CLV2)) + geom_line() + ylab("CLV2") + xlab("Period") + labs(title = "CLV 2 Evolution")

CLV <- apply(CLV.df, 2, sum)
CLV[7]
CLV[8]

head(mtcars)

str(mtcars)

filter(mtcars, gear == 4) # 过滤器可与所有标准逻辑运算符一起使用
filter(mtcars, gear == 3 | gear == 4) # 即 >、<、=>、<=、!=、==
filter(mtcars, mpg > 21)

arrange(mtcars, gear)
arrange(mtcars, gear, mpg)
arrange(mtcars, desc(mpg)) # desc 以降序排序

select(mtcars, gear, mpg, hp)
select(mtcars, -drat) # - 符号表示删除变量/列

slice(mtcars, 1:3)

sample_n(mtcars, 5) # 选择的行数
sample_frac(mtcars, .1) # 选择的行数占总行数的比例

mutate(mtcars, wt_mpg = wt * mpg)
mutate(mtcars, mpg_mean = mean(mpg), mpg_diff_mean = mpg - mpg_mean)
mutate(mtcars, mpg_mean_diff = mpg - mean(mpg))

summarise(mtcars, sd(disp))
summarise(mtcars, median(mpg), mean(mpg), max(mpg), min(mpg))

group_by(mtcars, cyl)

mtcars %>% # take dataframe, then
group_by(gear) %>% # group it by gear, then
summarise(mean(mpg)) # summarise the mean mpg for each level of gear

mtcars %>%
filter(mpg > 21) %>% select(gear, mpg, hp) %>% arrange(gear)

mtcars_mpg <- mtcars %>% filter(mpg > 21) %>% select(gear, mpg, hp) %>% arrange(gear)
mtcars_mpg

# Excercise
redwine <- read.csv("Data_redwine.csv", header=TRUE)
head(redwine)

wines_fixed_acidity_8_or_greater <- redwine %>%
filter(fixed.acidity >= 8)

wines_fixed_acidity_8_or_greater

# 使用filter函数筛选品质为7的葡萄酒
redwine_quality_7 <- redwine %>%
filter(quality == 7)

# 显示新数据框的前几行
head(redwine_quality_7)

# 使用select函数选择指定的两列,然后使用arrange函数按照pH的升序排序
redwine_selected_and_sorted <- redwine %>%
select(pH, quality) %>%
arrange(pH)

# 显示新数据框的前几行
head(redwine_selected_and_sorted)

# 使用select函数选择指定的两列,然后使用arrange函数按照品质的降序排序
redwine_selected_and_sorted <- redwine %>%
select(pH, quality) %>%
arrange(desc(quality))

# 显示新数据框的前几行
head(redwine_selected_and_sorted)

# 使用filter函数筛选没有柠檬酸的葡萄酒,然后使用arrange函数按照品质的降序排序
redwine_no_citric_acid <- redwine %>%
filter(citric.acid == 0) %>%
arrange(desc(quality))

# 显示新数据框的前几行
head(redwine_no_citric_acid)

# 使用summary函数对红葡萄酒数据集进行总结
redwine_summary <- summary(redwine)

# 显示总结结果
redwine_summary