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(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(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(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 管道操作符 %>%
允许您将一个函数的输出直接发送到下一个函数的输入。使用管道操作符时,请记住以下几点:
第一个参数始终是一个数据框。
后续参数指定对数据框要执行的操作。
参数的顺序将返回一个新的数据框(除非您通过分配操作(如使用“<-”)对第一个参数中的数据框进行了更改)。
> 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
创建一个仅包含固定酸度大于或等于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
创建一个仅包含品质为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
创建一个仅包含2列(pH和品质)的数据框。
# 使用select函数选择指定的两列 redwine_selected_columns <- redwine %>% select(pH, quality) # 显示新数据框的前几行 head(redwine_selected_columns)
创建一个仅包含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
创建一个仅包含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
创建一个仅包含没有柠檬酸的葡萄酒的数据框,并按照品质的降序排序。
> # 使用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
创建一个红葡萄酒数据集的版本,其中包含一个额外的列,该列包含酒精含量乘以密度。
# 使用mutate函数创建一个新列,该列为酒精含量乘以密度 redwine_with_extra_column <- redwine %>% mutate(alcohol_density = alcohol * density) # 显示新数据框的前几行 head(redwine_with_extra_column)
创建一个总结红葡萄酒数据集中每个变量的数据框。
> # 使用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