教程目的:
- 了解什么是 R 和 R Studio
- 养成使用脚本的好习惯
- 了解如何在 R 中导入数据
- 了解如何操作 R 对象,如向量和数据帧
- 制作一个简单的情节
什么是R?
R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。它由 Ross Ihaka 和 Robert Gentleman 开发,作为“S”编程语言的开源实现。凭借庞大的在线支持社区和专用软件包,几乎可以为任何应用程序和研究领域提供额外的功能,在 R 中几乎没有什么做不到的。
如果你需要更有说服力的东西,为什么我们使用R而不是许多其他统计软件包之一,如MATLAB,Minitab,甚至Excel?因为:
- R 是免费和开源的,而且永远都是!任何人都可以使用该代码并确切地了解其工作原理。
- 由于 R 是一种编程语言而不是图形界面,因此用户可以轻松地将脚本保存为小型文本文件以供将来使用,或与协作者共享。
- R 有一个非常活跃和乐于助人的在线社区 - 通常只需快速搜索即可找到某人已经解决了您遇到的问题。
1. 下载 R 和 RStudio
正如我们之前所说,R 本身没有图形界面,但大多数人通过提供额外功能的图形平台与 R 进行交互。
尽管R的功能十分强大,但是其作为一个命令行工具 1,在实际使用中尤为不便,因此,一款集成的开发环境十分有必要。Rstudio是一款专门针对R开发的一个集成环境,同时也支持其他多种语言,用户界面十分友好,支持代码高亮,拼写提示,作图展示等功能,因此我们推荐使用Rstudio对我们的数据进行分析。
可以从 CRAN下载 R。选择适合您的操作系统的链接。
然后,从 RStudio 网站下载 RStudio(选择免费的开源桌面版本)。
如果您使用的是 Mac,除了 R 和 RStudio 之外,您还需要下载 XQuartz(可在此处获得)。
打开 RStudio。单击“文件/新文件/R 脚本”。
您现在将看到一个如上图所示的窗口。
请记住,如果您直接在控制台中输入代码,它不会被 R 保存。相反,通过在脚本文件中键入代码,您可以创建可重现的分析记录。在脚本中编写代码类似于在 Word 中编写文章:它保存了您的进度,您可以随时从上次中断的地方继续,或对其进行一些更改。(记得经常点击保存(Ctrl+S
),这样你才能真正保存你的脚本!
RStudio 中的工作流程
在 RStudio 中工作主要有两种方式。
- 在交互式 R 终端控制台中测试,然后将代码复制到 .R脚本中保存并运行。
- 这在进行小型测试和最初开始时效果很好。
- 它很快就会变得费力。
- 开始写入 .R脚本 文件并使用 RStudio 的命令/快捷方式将当前行、选定行或修改后的行推送到R 终端控制台。
对于大多数应用,我们建议采用方法2。
制作一个新的.R 脚本文件,方法是单击左上角的小页面图标,然后从下拉菜单中选择 R 脚本。R 脚本基本上是带有 R 命令的文本文件。
运行代码段
RStudio 为您提供了从编辑器窗口中运行代码的极大灵活性。有按钮、菜单选项和键盘快捷键。要运行当前行,您可以:
- 单击编辑器面板上方的
Run
按钮。 - 从“代码”菜单中选择“运行行”。
- 在 Windows 或 Linux 或 OS X 上点击
Ctrl-Enter
或Command-Enter
(也可将鼠标悬停在按钮上来查看此快捷方式)。
提示:您还可以通过选择多行,然后使用 1、2 或 3 运行代码来运行多行。
有了这个,让我们开始在 R 控制台中玩吧!
使用 R 作为计算器
你可以用 R 做的最简单的事情就是做算术。尝试在控制台中键入:
*]:mt-1 [&.highlighted:last-child]:rounded-b-md [&.highlighted:last-child>*]:mb-1 [&:only-child]:hover:ring-transparent [&.highlighted]:rounded-none [&:not(.highlighted)_+_.highlighted]:rounded-t-md [&:not(.highlighted)_+_.highlighted>*]:mt-1 [&.highlighted:has(+:not(.highlighted))]:rounded-b-md [&.highlighted:has(+:not(.highlighted))>*]:mb-1 [&:not(.highlighted)_+_.highlighted:has(+:not(.highlighted))]:rounded-md" style="box-sizing: border-box; border: 0px solid rgb(229, 231, 235); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: transparent; --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; position: relative; grid-column: span 2 / span 2; display: grid; border-radius: 0.25rem; box-shadow: var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000); grid-template-columns: subgrid;">1 + 100
现在点击ENTER
.R 应返回:
*]:mt-1 [&.highlighted:last-child]:rounded-b-md [&.highlighted:last-child>*]:mb-1 [&:only-child]:hover:ring-transparent [&.highlighted]:rounded-none [&:not(.highlighted)_+_.highlighted]:rounded-t-md [&:not(.highlighted)_+_.highlighted>*]:mt-1 [&.highlighted:has(+:not(.highlighted))]:rounded-b-md [&.highlighted:has(+:not(.highlighted))>*]:mb-1 [&:not(.highlighted)_+_.highlighted:has(+:not(.highlighted))]:rounded-md" style="box-sizing: border-box; border: 0px solid rgb(229, 231, 235); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: transparent; --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; position: relative; grid-column: span 2 / span 2; display: grid; border-radius: 0.25rem; box-shadow: var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000); grid-template-columns: subgrid;">[1] 101
您应该看到答案,前面有“[1]”(暂时不用担心,我们稍后会解释。现在将其视为指示输出)。
如果键入不完整的命令,R 将等待您完成它。尝试输入以下内容:
> 1 -
在此阶段,R 实际上正在等待您完成命令。R 通过向您显示一个+
标志而不是通常的>
标志来让您知道这一点
+
每当您按回车键并且 R 会话显示 + 而不是>时,都表示它正在等待您完成命令。如果你想取消一个命令,你可以简单地点击Esc
,RStudio会给你>提示。
使用 R 作为计算器时,运算顺序与你在学校学到的相同。
从最高到最低优先级:
- 括号:
(
)
- 指数:或
^
**
- 除法:
/
- 乘法:
*
- 加法:
+
- 减法:
-
使用 R 作为花哨的计算器
使用函数和寻求帮助
R 具有许多内置的数学函数。要调用函数,我们只需键入其名称,后跟左括号和右括号。我们在括号内键入的任何内容都称为函数的参数。
以下是 R 提供的一些功能。
sin(1) # trigonometry functions
[1] 0.841471
log(1) # natural logarithm
[1] 0
log10(10) # base-10 logarithm
[1] 1
exp(0.5) # e^(1/2)
[1] 1.648721
变量
与其一次又一次地输入我们可能想要在计算中使用的数字,不如使用赋值运算符<-
将它们的值存储在变量中,如下所示:
frequently_used_number <- 1/40
请注意,赋值不输出值。取而代之的是我们将其存储在称为变量的东西中以备后用。
frequently_used_number
[1] 0.025
更准确地说,存储值是该分数的十进制近似值,称为浮点数。
您还可以使用=
frequently_used_number = 1/40
在 RStudio 的右上窗格中查找该选项卡,您将看到该选项卡及其值已出现。在任何需要数字的计算中,我们的变量都可以用来代替数字
log(frequently_used_number)
[1] -3.688879
另请注意,变量值可更新:
frequently_used_number <- 100
frequently_used_number
过去值 0.025,现在它的值为 100。
管理环境
可以使用一些有用的命令与 R 会话进行交互。
ls
将列出存储在全局环境(工作 R 会话)中的所有变量和函数:
> ls()
[1] "hook_error" "hook_in" "hook_out" "frequently_used_number"
请注意,这里我们没有给 ls
提供任何参数,但我们仍然需要给出括号来告诉 R 调用该函数。
如果我们自己打字,R 将打印出该函数的源代码!
> ls
function (name, pos = -1L, envir = as.environment(pos), all.names = FALSE,
pattern, sorted = TRUE)
{
if (!missing(name)) {
pos <- tryCatch(name, error = function(e) e)
if (inherits(pos, "error")) {
name <- substitute(name)
if (!is.character(name))
name <- deparse(name)
warning(gettextf("%s converted to character string",
sQuote(name)), domain = NA)
pos <- name
}
}
all.names <- .Internal(ls(envir, all.names, sorted))
if (!missing(pattern)) {
if ((ll <- length(grep("[", pattern, fixed = TRUE))) &&
ll != length(grep("]", pattern, fixed = TRUE))) {
if (pattern == "[") {
pattern <- "\\["
warning("replaced regular expression pattern '[' by '\\\\['")
}
else if (length(grep("[^\\\\]\\[<-", pattern))) {
pattern <- sub("\\[<-", "\\\\\\[<-", pattern)
warning("replaced '[<-' by '\\\\[<-' in regular expression pattern")
}
}
grep(pattern, all.names, value = TRUE)
}
else all.names
}
<bytecode: 0x34ad398>
<environment: namespace:base>
您可以使用以下方法删除不再需要的对象:rm
> rm(frequently_used_number)
如果你的环境中有很多东西,并且想要删除所有的东西,你可以将结果传递给函数,进行一次彻底清理。
> rm(list = ls())
在本例中,我们将两者结合起来。就像操作顺序一样,首先计算最内侧括号内的任何内容,依此类推。