R语言函数与数据可视化实战解析

内容分享2天前发布
0 0 0

table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}

61、创建以向量为输入并返回以下内容的函数:a. 偶数位置的元素;b. 除最后一个值之外的每个元素;c. 仅偶数(且无缺失值)。

以下是实现这些功能的 R 语言函数:

a. 获取偶数位置元素的函数:


even_positions <- function(x) {
  x[seq(2, length(x), 2)]
}

b. 获取除最后一个值之外的每个元素的函数:


except_last <- function(x) {
  x[-length(x)]
}

c. 获取仅偶数(且无缺失值)的函数:


even_values <- function(x) {
  x[x %% 2 == 0 & !is.na(x)]
}

62、通过创建一份简短的简历来练习你所学的内容。标题应该是你的名字,并且你至少要包含教育或工作经历的标题。每个部分都应该包含一个带项目符号的工作/学位列表。用粗体突出显示年份。


张三


教育背景


2018 – 2022

[大学名称] [专业] [学位]


工作经历


2022 – 至今

[公司名称] [职位]

63、添加一个部分来探讨钻石大小如何随切工、颜色和净度变化。

钻石大小随切工、颜色和净度的变化分析

为了探讨钻石大小如何随切工、颜色和净度变化,我们可以按以下步骤进行分析和可视化。

首先加载必要的库和数据集:


library(tidyverse)
data(diamonds)

然后分析钻石大小(以克拉为单位)与切工、颜色和净度的关系。我们可以通过分组计算不同切工、颜色和净度组合下的平均克拉数。


size_by_cut_color_clarity <- diamonds %>%
  group_by(cut, color, clarity) %>%
  summarise(avg_carat = mean(carat), .groups = 'drop')

接着进行可视化,使用三维柱状图或者分面图来展示这种关系。以下是使用分面图的示例:


ggplot(size_by_cut_color_clarity, aes(x = color, y = avg_carat, fill = cut)) +
  geom_col(position = 'dodge') +
  facet_wrap(~clarity) +
  labs(title = '钻石大小随切工、颜色和净度的变化', 
       x = '颜色', 
       y = '平均克拉数', 
       fill = '切工')

通过上述代码,我们可以直观地看到不同切工、颜色和净度组合下钻石大小的变化情况。

进一步分析的问题

哪种切工和颜色的组合通常对应较大的钻石?

净度对钻石大小有怎样的影响?是净度越高钻石越大,还是有其他规律?

是否存在某些特殊的切工 – 颜色 – 净度组合,其钻石大小明显偏离整体趋势?

通过对这些问题的探讨,我们可以更全面地了解钻石大小随切工、颜色和净度的变化规律。

64、在可视化编辑器中打开diamond – sizes.qmd文件,插入一个代码块,并使用knitr::kable()函数添加一个表格,展示diamonds数据框的前五行。

首先在可视化编辑器中打开

diamond-sizes.qmd

文件,然后插入一个代码块,在代码块中编写如下代码:


knitr::kable(diamonds[1:5, ])

65、建立一个代码块网络,其中代码块 d 依赖于代码块 c 和 b,并且代码块 b 和 c 都依赖于代码块 a。让每个代码块打印

lubridate::now()

,设置

cache: true

,然后验证你对缓存的理解。


#| label: a
#| cache: true
print(lubridate::now())

#| label: b
#| cache: true
#| dependson: "a"
print(lubridate::now())

#| label: c
#| cache: true
#| dependson: "a"
print(lubridate::now())

#| label: d
#| cache: true
#| dependson: "b", "c"
print(lubridate::now())

运行上述代码并观察各代码块的输出时间,若依赖代码块未改变,再次运行时依赖它的代码块应使用缓存结果,输出时间不变。

66、企鹅数据框中的bill_depth_mm变量描述的是什么?

需阅读?penguins帮助文档获取该变量描述的具体内容。

67、绘制

bill_depth_mm


bill_length_mm

的散点图。即,将

bill_depth_mm

放在 y 轴,

bill_length_mm

放在 x 轴。描述这两个变量之间的关系。

通常可根据绘制出的散点图判断:

若散点大致呈从左下角到右上角分布,可能是正相关;

若散点大致呈从左上角到右下角分布,可能是负相关;

若散点分布无明显规律,则可能无明显线性关系。

68、geom_point() 函数中的 na.rm 参数有什么作用?该参数的默认值是什么?创建一个散点图,其中成功将此参数设置为 TRUE。


`na.rm` 参数用于决定是否移除缺失值;在许多 R 函数中其默认值为 `FALSE` 。创建设置该参数为 `TRUE` 的散点图示例代码如下:

```r
ggplot(data = penguins, mapping = aes(x = flipper_length_mm, y = body_mass_g)) + 
  geom_point(na.rm = TRUE)


##69、以下两个代码绘制的条形图有什么不同?对于改变条形图的颜色,哪个美学属性(color 或 fill)更有用?代码如下:ggplot(penguins, aes(x = species)) + geom_bar(color = "red") ;ggplot(penguins, aes(x = species)) + geom_bar(fill = "red")
在这两个代码中,`ggplot(penguins, aes(x = species)) + geom_bar(color = "red")` 绘制的条形图,`color` 属性设置的是条形边框的颜色,即条形的轮廓为红色,而条形内部是默认颜色;  
`ggplot(penguins, aes(x = species)) + geom_bar(fill = "red")` 绘制的条形图,`fill` 属性设置的是条形内部的填充颜色,即条形内部为红色。  
对于改变条形图颜色(通常指填充颜色),`fill` 更有用。

##70、对加载tidyverse包后可用的diamonds数据集中的carat变量制作直方图。尝试不同的binwidth值。哪个值能揭示最有趣的模式?
使用了 `0.5` 和 `0.01` 两个 `binwidth` 值,`0.01` 的 `binwidth` 揭示了更有趣的模式,如:

- 为什么整克拉和常见分数克拉处有更多钻石
- 以及为什么每个峰值右侧的钻石比左侧多

但实际中可能需更多尝试来确定最有趣模式对应的 `binwidth`,没有绝对标准值。

##71、在R语言中,使用ggplot2库对数据框penguins创建以下两个堆叠条形图。第一个图的代码是ggplot(penguins, aes(x = island, fill = species)) + geom_bar(position = "fill");第二个图的代码是ggplot(penguins, aes(x = species, fill = island)) + geom_bar(position = "fill")。请问第一个图能回答什么问题?第二个图能回答什么问题?
- 第一个图(x为island,fill为species)可用于比较不同岛屿上企鹅物种的分布比例;
- 第二个图(x为species,fill为island)可用于比较不同物种企鹅在各岛屿的分布比例。

##72、要将之前代码中的图形保存为 PDF 而非 PNG,需要做哪些更改?如何了解 ggsave() 支持保存哪些类型的图像文件?
可在 `ggsave()` 的文档中了解支持保存的图像文件类型。要将图形保存为 PDF 而非 PNG,在使用 `ggsave()` 函数时,将文件名的扩展名设置为 `.pdf` 即可,例如:

```r
ggsave("your_plot.pdf")

73、按下Option + Shift + K/Alt + Shift + K会发生什么?如何通过菜单到达相同的位置?

通常在软件中,按下特定快捷键可能会触发某些功能或打开特定窗口。要通过菜单到达相同位置,可在软件的菜单中寻找类似功能的选项,一般可在帮助菜单下找到相关的快速参考或快捷键帮助等内容。

74、在单个管道中,找出满足以下条件的所有航班:• 到达延误两小时或以上 • 飞往休斯顿(IAH 或 HOU) • 由联合航空、美国航空或达美航空运营 • 在夏季(7 月、8 月和 9 月)出发 • 到达延误超过两小时,但未晚点出发 • 延误至少一小时,但在飞行中追回了超过 30 分钟的时间

通常在 R 语言中可以使用

dplyr

包的函数,如

filter

等,结合逻辑条件来筛选满足这些条件的航班,示例代码框架可能如下:


flights |> 
  filter(
    arr_delay >= 120,
    dest %in% c('IAH', 'HOU'),
    carrier %in% c('UA', 'AA', 'DL'),
    month %in% c(7, 8, 9),
    arr_delay > 120 & dep_delay <= 0,
    dep_delay >= 60 & (dep_delay - arr_delay) > 30
  )

其中

flights

为航班数据框,具体代码需根据实际数据结构调整。

75、对航班进行排序,找出出发延误时间最长的航班。找出清晨最早起飞的航班。

可通过以下代码实现:

对于找出出发延误时间最长的航班,可使用

flights |> arrange(desc(dep_delay))

对于找出清晨最早起飞航班,可使用

flights |> arrange(dep_time)

前提是

flights

为航班数据框,

dep_delay

为出发延误时间列,

dep_time

为出发时间列。

76、如果你同时使用filter()和arrange(),使用它们的顺序重要吗?为什么?从结果和函数所需的工作量来考虑。

顺序是重要的。先使用

filter()

过滤数据可以减少后续

arrange()

需要处理的数据量,提高效率,并且不同顺序可能导致结果不同,因为

filter()

会改变数据集合,

arrange()

是在当前数据集合上进行排序。

77、any_of()函数的作用是什么?为什么它与向量 variables <- c(“year”, “month”, “day”, “dep_delay”, “arr_delay”) 结合使用可能会有帮助?

any_of()

函数用于选择数据框中名称出现在给定字符向量中的变量。与该向量结合使用时,可方便地从数据框中选择包含在向量中的变量,避免手动逐个指定变量名。

78、哪家航空公司的平均延误情况最严重?挑战:能否区分是机场不佳还是航空公司不佳导致的影响?为什么能或不能?(提示:考虑 flights |> group_by(carrier, dest) |> summarize(n()) )

若要找出平均延误最严重的航空公司,可按航空公司分组计算平均延误:


按航空公司分组

,计算每个航空公司的平均延误时间。

对于区分机场和航空公司的影响,可采取以下步骤:



航空公司



目的地机场

分组;

统计每组的

航班数量

结合

机场



航空公司

相关的延误数据进行进一步分析。

79、找出从每个目的地出发时延误最严重的航班。

可按以下思路操作:使用分组函数按目的地分组,然后在每个组内找出出发延误时间最大的航班,以R语言为例,代码可能如下:


flights |> 
  group_by(dest) |> 
  filter(dep_delay == max(dep_delay, na.rm = TRUE))

80、访问RStudio提示的Twitter账号,找到一条看起来有趣的提示并进行实践!

你可以通过以下步骤完成:

打开Twitter

搜索RStudio Tips账号

浏览其中的提示

选择一条有趣的进行实践操作

81、RStudio诊断会报告哪些其他常见错误?

需阅读文章《code diagnostics》来了解

82、如果文件中的字段用 | 分隔,你会使用什么函数来读取该文件?

可使用read_delim()函数,指定分隔符为 | 来读取。

83、read_fwf()最重要的参数有哪些?

可通过fwf_widths()指定字段宽度,或通过fwf_positions()指定字段位置。

84、创建一个 hwy 与 displ 的散点图,其中的点为粉色实心三角形。

在 R 语言中使用

ggplot2

包可按如下代码实现:


ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point(shape = 17, fill = "pink", color = "pink")

其中,

shape = 17

代表三角形,

fill


color

都设为

"pink"

以实现粉色实心效果。

85、以下代码

ggplot(mpg) + geom_point(aes(x = displ, y = hwy)) + facet_grid(drv ~ .)


ggplot(mpg) + geom_point(aes(x = displ, y = hwy)) + facet_grid(. ~ cyl)

会生成什么图形,分别有什么作用?


`facet_grid(drv ~ .)` 会按 `drv` 变量的不同水平将图形在垂直方向上分割成多个子图,每个子图展示不同 `drv` 水平下 `displ` 和 `hwy` 的关系;  
`facet_grid(. ~ cyl)` 会按 `cyl` 变量的不同水平将图形在水平方向上分割成多个子图,每个子图展示不同 `cyl` 水平下 `displ` 和 `hwy` 的关系。  
`.` 表示不进行该方向的分面。

86、以 ggplot(mpg) + geom_point(aes(x = displ, y = hwy)) + facet_wrap(~ class, nrow = 2) 为例,使用分面而非颜色美学有哪些优点?有哪些缺点?如果数据集更大,这种平衡会如何变化?


优点:
- 分面能清晰展示各子集分布和关系,避免颜色过多导致视觉混乱;
- 可独立观察各子集细节。

缺点:
- 占用空间大,子图过多会使单个子图变小难以看清;
- 难以整体把握数据全局特征。

若数据集更大:
- 分面优势更明显,能更好展示各子集特征;
- 但子图过多会让缺点更突出,如布局拥挤。

87、查看facet_wrap。nrow的作用是什么?ncol的作用是什么?还有哪些选项可以控制各个面板的布局?为什么facet_grid()没有nrow和ncol参数?

通常,

nrow

用于指定分面布局的行数,

ncol

用于指定列数。其他控制布局的选项可能包括

as.table


dir

等。

facet_grid()

没有

nrow


ncol

参数是因为它根据行和列变量的唯一组合来布局面板,而不是像

facet_wrap()

那样按指定的行列数排列。

88、使用facet_wrap()而不是facet_grid()重新创建绘图ggplot(mpg) + geom_point(aes(x = displ, y = hwy)) + facet_grid(drv ~ .) ,分面标签的位置会如何变化?

使用

facet_wrap()

时,分面标签通常会出现在每个分面的上方;而使用

facet_grid(drv ~ .)

时,分面标签会出现在每行分面的左侧。

所以从

facet_grid(drv ~ .)

切换到

facet_wrap()

,分面标签位置会从左侧移到上方。

89、geom_col() 有什么作用?它与 geom_bar() 有什么不同?

通常,

geom_bar()

默认使用

stat_count()

统计每个组的观测数量,而

geom_col()

用于绘制柱状图时,直接使用数据中的值作为柱子的高度,即

geom_col()

相当于

geom_bar(stat = "identity")

90、大多数几何对象(geoms)和统计变换(stats)是成对出现的,并且几乎总是一起使用。列出所有的成对组合。它们有什么共同之处?

未明确列出所有成对组合。它们的共同之处是:

每个

geom

都有默认的

stat

每个

stat

也有默认的

geom

通常使用

geoms

时无需担心底层的统计变换。

91、在R语言的ggplot2包中,代码 ggplot(mpg, aes(x = displ, y = hwy)) + geom_point() 与 ggplot(mpg, aes(x = displ, y = hwy)) + geom_point(position = “identity”) 所绘制的图之间是否有差异?如果有,差异是什么?为什么?


ggplot2

中,

geom_point()

默认的

position

就是

"identity"

,即直接绘制数据点,不进行位置调整,所以这两个图通常没有视觉上的差异。

92、geom_jitter() 函数中哪些参数可以控制抖动的程度?

通常在 R 语言的 ggplot2 包中,

geom_jitter()

函数里

width


height

参数可控制抖动程度,

width

控制水平方向抖动量,

height

控制垂直方向抖动量。

93、比较并对比 geom_jitter() 和 geom_count()。

geom_jitter()

用于为数据点添加随机抖动,可解决小尺度下数据点重叠问题,使数据分布更清晰,适用于连续与分类变量关系展示;

geom_count()

用于统计每个组合的观测数量,通过圆圈大小展示,适用于探索两个分类变量的协变关系。

94、geom_boxplot() 的默认位置调整是什么?创建一个 mpg 数据集的可视化来展示它。


`geom_boxplot()` 的默认位置调整是 `'dodge2'`,它用于处理分组变量,使得不同组别的箱线图能够并排显示。

以下给出了 `mpg` 数据集可视化示例:

```r
ggplot(mpg, aes(x = fct_reorder(class, hwy, median), y = hwy)) + 
  geom_boxplot()

若变量名长,可交换 x 和 y 轴映射:


ggplot(mpg, aes(x = hwy, y = fct_reorder(class, hwy, median))) + 
  geom_boxplot()

95、下面的绘图代码 ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) + geom_point() + geom_abline() + coord_fixed() 能告诉我们城市道路和高速公路每加仑英里数(mpg)之间的什么关系?为什么 coord_fixed() 很重要?geom_abline() 的作用是什么?

该绘图通过散点展示城市和高速公路 mpg 关系;


coord_fixed() 

保证 x 和 y 轴单位长度比例固定,使图形形状正确;


geom_abline() 

添加一条参考线。

96、探索钻石数据集中x、y和z变量的分布。你有什么发现?思考一下钻石的情况,你会如何确定哪个维度是长度、宽度和深度。

y变量中值为0是不正确的,可能是缺失数据被编码为0,32mm和59mm的测量值可能不合理。对于确定钻石维度,一般较长的边可视为

长度

,与之垂直较短的边视为

宽度

,垂直于长和宽平面的为

深度

,但具体需结合钻石形状判断。

97、探索价格的分布。你是否发现了任何不寻常或令人惊讶的事情?(提示:仔细考虑组距,并确保尝试多种不同的值。)

可在分析时通过不同组距绘制价格分布直方图等可视化图表来探索

关注是否存在价格集中区域、异常峰值、空缺区间等不寻常情况

98、在直方图上放大时,比较并对比 coord_cartesian() 和 xlim() 或 ylim()。如果不设置 binwidth 会怎样?如果尝试缩放至只显示半个条形图会怎样?

在直方图上放大时,

coord_cartesian()

用于缩放坐标轴,它不会丢弃超出限制范围的数据,只是改变显示范围;而

xlim()


ylim()

函数会丢弃超出限制范围的数据。

通常不设置

binwidth

时会使用默认值,缩放至只显示半个条形图可能会影响对数据分布的判断。

99、在mean()和sum()函数中,na.rm = TRUE的作用是什么?


mean()


sum()

函数中,

na.rm = TRUE

表示在计算均值或总和时忽略缺失值(

NA

)。

100、使用燃油经济性数据重新创建一个图表,要求点的颜色和形状会根据传动系统类型而变化。


下面是给定的【文本内容】::需使用相关数据和绘图代码来实现。可使用 `ggplot` 函数结合 `aes` 设置不同传动系统类型对应的颜色和形状映射,再添加相应的几何图形层。

示例:

```r
ggplot(mpg, aes(x = displ, y = hwy, color = drv, shape = drv)) + geom_point()

说明:

mpg

为燃油经济性数据框;

displ


hwy

为变量;

drv

为传动系统类型变量,可根据实际情况调整。

“`

101、使用

geom_text()

添加的标签与分面如何相互作用?如何向单个分面添加标签?如何在每个分面中放置不同的标签?(提示:思考传递给

geom_text()

的数据集。)

可通过向

geom_text()

传递合适的数据集来实现。若要向单个分面添加标签,可筛选出该分面对应的数据并传递给

geom_text()

;若要在每个分面放置不同标签,可在数据集中为每个分面设置不同的标签值再传递给

geom_text()

102、为什么下面的代码没有覆盖默认比例尺?代码为:df <- tibble( x = rnorm(10000), y = rnorm(10000)) ggplot(df, aes(x, y)) + geom_hex() + scale_color_gradient(low = “white”, high = “red”) + coord_fixed()

此代码未覆盖默认比例尺可能是因为

geom_hex()

使用的是

fill

美学,而

scale_color_gradient()

是用于

color

美学的,应使用

scale_fill_gradient()

来覆盖

fill

美学的默认比例尺。

© 版权声明

相关文章

暂无评论

none
暂无评论...