01 2019 档案
摘要:我们使用 new.env( ) 函数创建一个新环境:e1 <- new.env()环境通常用十六进制数表示,即内存地址:e1## <environment: 0x0000000014a45748>我们可以用提取操作符($ 和 [[)在环境中创建变量,其代码形式类似于修改一个列表:e1$x <- 1e
阅读全文
摘要:环境是由一组名称组成的对象,每个环境(除了空环境)都有一个父环境。每个名称(也称为符号或变量)都指向一个对象。当我们查找一个符号时,如果它在当前环境中,R 就 会在当前环境中搜索并返回该符号指向的对象。如果这个符号在当前环境中没有找到,R 就会到它的父环境中搜索(直到找遍所有环境)。图 8-1 说明
阅读全文
摘要:上一节我们介绍了复制—修改机制,示例中给出了触发该机制的两种情况。当一个对象有多个名称或作为参数传递给函数时,修改这个对象会先复制它,然后再修改它的副本。对于在函数外修改对象,我们介绍了<<- 的用法,首先找到函数外的变量,然后修改 该对象而不是局部复制。这就引出了一个重要的概念,即函数有内部和外部
阅读全文
摘要:前一节中我们展示了惰性求值的工作机制,通过避免不必要计算,节省时间和内存。本节要介绍 R 的一个重要特性,以便更安全地处理数据。我们先创建一个简单的数值向量 x1:x1 <- c(1, 2, 3)然后将 x1 的值赋给 x2:x2 <- x1现在 x1 和 x2 的值完全相同。如果我们修改其中一个向
阅读全文
摘要:如果能够理解 R 函数的运行机制,那么对 R 的运行机制就能够掌握十之八九。通过前几章的学习,我们掌握了一些最常用的基本函数的用法,但是可能对其内部机制仍有疑惑。比如创建如下的函数:test0 <- function(x, y) {if (x > 0) x else y} 这个函数有点特殊,看似只有
阅读全文
摘要:在前面的章节中,我们已经学习了 R 中最常用到的对象类型和函数。掌握了如何创建和修改向量、列表和数据框,如何定义自己的函数,以及如何用恰当的表达式把脑中的逻辑转换成编辑器中的 R 语言代码。有了这些对象、函数和表达式,就可以开始处理数据了。本章将开始数据处理的旅程,主要包括以下几个主题: 读写数据
阅读全文
摘要:实际的数据分析中,我们大部分时间都在进行数据清洗(data cleansing),即对原数据进行筛选和转换,使其更易于分析。这个筛选和转换的过程也叫数据处理(data manipulation)。我们将在第 12 章中详细介绍这个主题。在这一小节,我们直接假设数据已经过处理,可以用于分析。我们不对模
阅读全文
摘要:这一节,我们尝试用另一种模型拟合数据,这种模型称作回归树(regression tree) (https://en.wikipedia.org/wiki/Decision_tree_learning),它是一种机器学习模型。它不是简单的线性回归,而是用决策树来拟合数据。假设我们想根据太阳辐射(Sol
阅读全文
摘要:R 中最简单的模型就是线性模型,即使用一个线性模型描述两个随机变量在一系列假设下的关系。在以下例子中,我们创建了一个线性函数,将 x 映射到 3+2*x(即 f(x))。然后,生成一个正态分布的随机数值向量 x,再用 f(x)加上一些独立的噪声生成 y:f <- function(x) 3 +2 *
阅读全文
摘要:直方图和密度图是展示数据分布的两种形式。通常只需要几个关键的分位数,我们就能对数据的整体分布有一个印象。箱线图(或称为盒须图,box-and-whisker plot)是完成此项任务的简单方式。对于一个随机生成的数值向量,我们可以调用boxplot( )来绘制箱线图,如图7-28所示。x <- rn
阅读全文
摘要:在上一节中,我们介绍了一些导入数据的函数,这是大多数数据分析的第一步。通常,最好在将数据代入模型前先查看一下数据,这也是我们下一步要讲的内容。原因很简单,不同的模型具有不同的优势,没有任何一个模型在所有情况下都是最佳的,因为这些模型都有一系列不同的假设。若不根据假设条件对数据进行检验,就随意应用一个
阅读全文
摘要:前面我们已经学会了如何创建几种不同类型的图。散点图和折线图是对数据集中观测值直接作图,柱状图和饼状图通常用于对不同类别的数据进行粗略总结。上述这几种图形有以下两方面的局限性:散点图和折线图表达的信息过多,以至于很难刻画出重点特征;饼状图和柱状图则丢弃过多信息,因此也难以做出可信判断。直方图能够展示数
阅读全文
摘要:在前面的小节中,我们已经学会了如何创建散点图和折线图。此外,还有其他几种类型的图形比较有用,在这里值得一提。柱状图是其中最常用的一种。柱状图中柱子的高度可以用于对比不同类别的数量。我们创建一个最简单的柱状图,如图7-20所示。这里,使用barplot( )而不是plot( ):barplot(1:1
阅读全文
摘要:另一种有用的图形是饼状图。用于创建饼状图的函数 pie( ),与 barplot( )的运行方式类似。它作用于含有说明标签的数值向量;也可以直接作用于命名数值向量。图 7-22是一个简单的例子:grades <- c(A = 2, B = 10, C = 12, D = 8)pie(grades,
阅读全文
摘要:对于时间序列数据,折线图能更清楚地展示随时间发展的趋势和变化。如图 7-13 所示,创建折线图,只需要在调用 plot( )时设置 type= "l"即可:t <- 1:50y <- 3 * sin(t * pi /60) + rnorm(t)plot(t, y, type = "l",main =
阅读全文
摘要:在 R 中,可视化数据的基本函数是 plot( )。如果我们只为 plot( )提供一个数值向量或整数向量,它将按索引顺序产生一个散点图。例如,以下代码按递增顺序创建包含10 个点的散点图,如图 7-3 所示。plot(1:10) 图 7-3192 第 7 章 数据处理我们可以通过生成两个线性相关的
阅读全文
摘要:在 R 中,任何类型的数据分析的第 1 步都是加载数据,即将数据集导入到环境中。在此之前,我们必须判断出数据文件的类型,并选择适当的工具来读取数据。 读写文件中的文本格式数据 读写 Excel 工作表 读写原生数据文件 加载内置数据集
阅读全文
摘要:R 中有大量的内置数据集。它们可以很容易地被加载并投入使用,主要用于演示和测试。内置数据集主要是以数据框的形式进行存储,它们都附有详细的介绍。例如,iris 和 mtcars 是 R 中最有名的数据集。可以用?iris 和?mtcars 分别查看这两个数据集的描述。通常,这些描述是很具体的——它不仅
阅读全文
摘要:在前面的章节中,我们已经介绍了 CSV 文件和 Excel 工作簿的读写函数。这些不是 R 的原生数据格式,也就是说,原始数据对象和输出文件之间有所不同。例如,我们想把一个数据框导出为 CSV 格式,其中,这个数据框有很多具有不同的数据类型的列。那么,在导出过程中,列的类型会被丢失。无论是数字、字符
阅读全文
摘要:导入诸如 CSV 之类文本格式的数据的优点是不需要依靠某些特定软件来读取数据,并且文件具有可读性,即软件中性。然而,它的缺点也很明显——我们不能直接对文本编辑器中的数据执行计算操作,因为这些内容是纯文本格式的。Excel 工作簿是另一种存储表格数据的常用格式。一个 Excel 工作簿可以包含一个或多
阅读全文
摘要:在所有用于存储数据的文件类型中,CSV 可能是使用最广泛的。在标准 CSV 文件中,第 1 行是列的标题,后面每行都代表了一条数据记录,每列之间用逗号分开。下面就是一个用 CSV 格式编写的学生记录的例子:Name,Gender,Age,MajorKen,Male,24,FinanceAshley,
阅读全文
摘要:在前面的章节中,我们已经学习了用于基本对象操作的多类内置函数,并且知道了如何获取对象的类、类型和维度;如何进行逻辑、数学和基本统计计算;以及如何完成像根查找这样的简单分析任务。这些函数是我们解决特定问题的基石。字符串相关函数是一类非常重要的函数,本章将介绍这些函数。在 R 中,文本存储在字符向量中,
阅读全文
摘要:基于研究需要,我们可能要从公开网页或需要认证的数据库中下载数据。这些数据源提供的数据格式多种多样,而且大多数数据都被规范地整理在一起。例如,许多经济、金融数据库提供 CSV 格式的数据,这是一种支持非常广泛、用于表示表格数据的文本格式。一个典型的 CSV 格式看起来如下:id,name,score1
阅读全文
摘要:现在我们回头看看本节最开始遇到的那个问题。解决方法和水果例子完全相同,找到模式,然后分组。首先,看一下原始数据中典型的一行:2014-02-01,09:20:29,Ken,James,Hey, how are you?显然,每一行都具有相同的格式,也就是日期、时间、发送者、接收者、信息,并且用逗号隔
阅读全文
摘要:在字符串模式中,我们使用括号对想要从文本中提取的部分做标记。在这个问题中,我们修改模式为:(\w+):\s(\d+),其中有两组被标记:一个是通过"\w+"匹配的水果名,另一个是通过"\d+"匹配的水果数量。现在我们用改进后的模式来提取想要的信息。尽管 R 的内置函数已经完全能够胜任这项工作,我仍然
阅读全文
摘要:为了解决这个问题,计算机无需真正理解水果是什么。我们只需要找到一个能描述需要的模式即可。字面上,我们想要找到所有以一个单词开始,然后一个分号和一个空格,最后以一个整数而不是单词或者其他符号结尾的行。 正则表达式提供了一系列用于表示模式的符号。上述模式可以被描述成^\w+:\s\d+$,其中的元符号(
阅读全文
摘要:在数据分析中,常常会遇到日期和时间类型数据。与日期相关的最简单的函数可能是:Sys.Date( )返回当前日期;Sys.time( )返回当前时间。 当本书被渲染出来的时候,打印出来的日期如下:Sys.Date()## [1] "2017-02-09"时间是:Sys.time()## [1] "20
阅读全文
摘要:在前面的章节中,我们学习了如何将字符串转换为日期和日期/时间对象。在这一节中,将会学到相反的操作:根据特定的模板将日期和日期/时间对象转换回字符串。一旦创建了一个日期对象,每次打印时,它总是以标准格式表示: my_date## [1] "2016-02-10"我们可以使用 as.character(
阅读全文
摘要:我们可以根据初始值创建一个自定义日期:as.Date(1000, "1970-01-01")## [1] "1972-09-27"在更多的情况下,我们通过标准的文本格式来创建时间和日期:my_date <- as.Date("2016-02-10")my_date## [1] "2016-02-10
阅读全文
摘要:R 中的字符向量被用来存储文本数据。不同于其他编程语言的是,R 中字符向量并非单个字符、字母或者字母符号如 a、b、c。相反,它是一个包含字符串的向量。R 也提供了许多用来处理字符向量的内置函数。其中很多可以执行向量化操作,因此它们可以一步完成对多个字符串的处理。在本节中,你将学到更多有关字符向量中
阅读全文
摘要:sprintf( )函数很强大,但并非适用于所有应用场景。例如,如果一些部分在模板中多次出现,那么就需要多次写一样的参数。这通常会使得代码冗长而且难以修改:sprintf("%s, %d years old, majors in %s and loves %s.", "James", 25,"Phy
阅读全文
摘要:有时候使用 paste( )连接文本并不是一个好主意,因为文本不得不被分离成多个小段,而且随着格式越来越长,也会变得难以阅读。举个例子,假设我们需要按以下格式打印出 students_df 中的每条记录:#1, name: Tony, age: 26, major: Physics在这种情况下,使用
阅读全文
摘要:许多情况下我们需要把文本转换为其他形式,所幸,对文本进行多种形式的转换并非难事。1.转换大小写当我们处理文本数据时,输入可能不符合我们设定的标准。例如,我们希望所有产品都用大写字母(从 A~F)进行分级,但实际输入的字母可能既有大写也有小写。转换大小写有利于确保输入的字符串在大小写上保持一致。tol
阅读全文
摘要:在实践中,我们经常需要将多个字符串连接成一个。paste( )函数就是用来连接多个字符向量的函数。这个函数也使用空格作为默认分隔符:paste("Hello", "world")## [1] "Hello world"paste("Hello", "world", sep ="-")## [1] "
阅读全文
摘要:也许查看文本是我们对文本所能做的最基础的事情。R 提供了许多在控制台中查看文 本的方式。最简单的方式是,直接在引号中输入文本:"Hello"## [1] "Hello"如同由浮点数组成的数值向量,一个字符向量是一个由字符值或字符串组成的向量。Hello 是我们刚刚创建的字符向量中的第 1 个,也是唯
阅读全文
摘要:在前面的章节中,我们已经学习了如何创建几种基本类型的对象,包括用来存储数据的原子向量、列表和数据框,以及如何创建函数来表达程序逻辑。在此基础上,我们掌握了利用不同类型的表达式来控制涉及基本对象的逻辑流。现在,我们越来越熟悉基本术语和 R 编程语言的语法。鉴于此,可以创建一个使用内置函数处理基本对象的
阅读全文
摘要:apply 函数将一个函数应用到矩阵或数组的某个边际( margin )或维度上。例如,计算矩阵每一行的和,因为行是矩阵的第 1 个维度,所以我们指定 MARGIN = 1 ,这样就可以在每次迭代中,将 sum( )函数应用到矩阵的每个行切片(数值向量)上:mat <- matrix(c(1, 2,
阅读全文
摘要:之前,我们讨论过可以使用 for 循环,在一个向量或列表上进行迭代,重复执行某个表达式。但是在实践中,for 循环往往是最后的选择,因为每次迭代都是相互独立的,所以我们可以使用更简洁更方便的读写方式来实现同样的效果。举个例子,以下代码使用 for 循环创建了一个列表,它由 3 个相互独立、服从正态分
阅读全文
摘要:相比 lapply( )和 sapply( )在一个向量上迭代,mapply( )可以在多个向量上进行迭代。换句话,mapply 是 sapply 的多元版本:mapply(function(a, b, c) a * b + b * c + a * c,a = c(1, 2, 3), b = c(5
阅读全文
摘要:尽管 sapply 非常方便和智能,但有时智能可能隐藏着风险。假如我们有一个数字列表:x <- list(c(1, 2), c(2, 3), c(1, 3))如果我们想得到一个向量,其中每个元素都是 x 中对应数字的平方。那么,sapply( )就比较方便易用,因为它会自动尝试简化结果的数据结构:s
阅读全文
摘要:列表并非总是存储结果的最佳容器。有时,我们希望将结果放在一个向量或者矩阵中。sapply( )函数可以根据结果的结构将其合理简化。假设,我们将平方运算应用到 1:10 的每个元素上。如果使用 lapply( ),返回的结果就是一个包含平方数的列表。实际上,结果列表的所有成分都是一个单值数值向量,所以
阅读全文
摘要:正如前面展示的,lapply( )函数接收一个向量和一个函数作为输入参数。它将这个函数应用到向量中的每个元素,再将结果以列表的形式返回。当每次迭代都是相互独立时,这个函数就非常好用。因为在这种情况下,我们不需要构建一个显式迭代器来明确每步迭代过程。lapply( )不仅适用于向量,也适用于列表。假设
阅读全文
摘要:基本数学函数: abs, sqrt, ceiling, floor, trunc, round, signif, sin, asin, sinh, log(x, base=n), log, log10, exp 1 2 abs(-2) exp(c(-1,0,1,2)) 1 2 abs(-2) exp
阅读全文
摘要:逻辑向量只取 TRUE 或 FALSE,主要用来筛选数据。实践中,由多个逻辑向量构建联合条件是很常见的,并且联合条件中有可能涉及多个逻辑运算符和逻辑函数。 逻辑运算符 逻辑函数 处理缺失值 逻辑强制转换
阅读全文
摘要:一些被设定接收逻辑输入的函数也可以接收非逻辑向量,例如数值向量。但是,函数处理非逻辑向量的方式可能与逻辑向量有所不同。因为,非逻辑向量会被强制转换成逻辑向量。举个例子,如果我们在 if 条件中输入一个数值向量,它就会被强制转换:if (2) 3## [1] 3if (0) 0 else 1## [1
阅读全文
摘要:现实世界中的数据经常包含缺失值,用 NA 表示。下面的数值向量就是一个简单的例子:x <- c(-2, -3, NA, 2, 3, 1, NA, 0, 1, NA, 2)对缺失值进行算术运算也会产生缺失值:x + 2## [1] 0 -1 NA 4 5 3 NA 2 3 NA 4类似地,进行逻辑运算
阅读全文
摘要:在这一节中,我们将关注聚合逻辑向量并寻找真正的元素。1.聚合逻辑向量正如我们前面提到的,除了二元逻辑运算符,还有一些逻辑聚合函数也是非常有用的。最常用的两个逻辑聚合函数是any( )和all( )。只要给定逻辑向量的任何一个(至少一个)元素是TRUE,函数any( )就返回 TRUE;否则,函数 a
阅读全文
摘要:与很多编程语言类似,R 可以使用几个运算符进行逻辑运算,如表 5-1 所示。 表 5-1运算符 描述 示例 结果& 向量化 AND c(T, T) & c(T, F) TRUE, FALSE| 向量化 OR c(T, T) | c(T, F) TRUE, TRUE&& 单变量 AND c(T, T)
阅读全文
摘要:在上一章中,我们学习了一些基于环境和扩展包的函数。本节我们将了解一些处理对象的基本函数。更具体地说,我将向你介绍更多识别数据对象类型(type)和维度(dimension)的函数。你将了解到这些函数的概念以及它们是如何组合使用的。 检查对象类型 识别数据维度
阅读全文
摘要:矩阵、数组和数据框的性质除了类和类型,还有维度。1.获取数据维度在 R 中,向量是通过一维数据结构创建的:vec <- c(1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6)class(vec)## [1] "numeric"typeof(vec)## [1] "double"同
阅读全文
摘要:虽然 R 中的一切都是对象,但它们有不同的类型。试想我们正在处理一个用户自定义的对象,那么,就要根据输入对象的类型来创建相应的函数。例如,我们需要创建一个名为 take_it 的函数,如果输入对象是一个原子向量(例如数值向量、字符向量或者逻辑向量),函数就返回输入对象的第 1 个元素;如果输入对象是
阅读全文
摘要:表达式(expression)是函数的基本组成部分。R 有非常清晰的语法结构,一个符号或一次函数调用,都是一种表达式。尽管我们所做的事情本质上都是通过函数实现的,但是,R 为一些函数提供了特殊的语法,便于我们写出可读性更高的 R 代码。在下面的几个小节中,我们将了解以下具有特定语法结构的基础表达式:
阅读全文
摘要:循环(或迭代)通过迭代一个向量(for)或者检查某个条件是否被违背(while),来重复执行某个表达式。如果只需在输入值上做一些改变,而要重复执行同样的任务,那么这样的语言结构(循环)可以很大程度上减少冗余代码。 使用 for 循环 使用 while 循环
阅读全文
摘要:与 for 循环不同,while 循环会一直运行,直到给定条件不满足为止。例如,下面的 while 循环从 x=0 开始。每次循环都会检查 x<=10 是否成立。如果成立,就执行循环内部的表达式;如果不成立,就终止循环:x <- 0while(x <= 5) {cat(x, "", sep = ""
阅读全文
摘要:for 循环通过迭代一个给定向量或列表,重复执行某个表达式。for 循环的语法是这样的:for (var in vector) {expr}var 遍历 vector 中的各个元素值,expr 被反复迭代执行。如果 vector 中有 n 个元素,那么上述循环就等价于:var <- vector[[
阅读全文
摘要:与处理 TRUE 和 FALSE 条件的 if 相比,switch 语句则是用来处理数字或者字符串,并根据输入返回某个分支。假设输入一个整数 n,switch 返回从第 1 个参数开始的第 n 个参数值:switch(1, "x", "y")## [1] "x"switch(2, "x", "y")
阅读全文
摘要:我们经常会发现,有些程序的逻辑并不是完全从上到下按顺序执行,而是包含一些依赖于特定条件的分支结构。因此,条件表达式是标准编程语言的基本结构之一。在 R 中,if 语句可以通过逻辑条件对逻辑流进行分支。 使用 if 语句 使用 if 表达式 在 if 条件句中使用向量 使用向量化的 if:ifelse
阅读全文
摘要:上述例子的函数中,都只输入了单一值。如果我们提供一个向量,那么这个函数将产生警告,这是因为 if 语句不能与多值向量共存。check_ _positive(c(1,-1,0))## Warning in if (x > 0) 1: 条件的长度大于一,因此只能用其第一元素## [1] 1从输出结果可以
阅读全文
摘要:进行分支计算的一个替代方法是 ifelse( )。这个函数接收一个逻辑向量作为判定条件,并且返回一个向量。对于逻辑判定条件内的每一个元素,若是 TRUE,则选择第 2个参数 yes 中所对应的元素;若是 FALSE,则选择第 3 个参数 no 中所对应的元素。总而言之,ifelse( ) 是 if
阅读全文
摘要:由于 if 本质上是一个原函数,它的返回值就是满足条件分支表达式的值,因此,if 表达式也可以用作内联函数。我们以 check_positive( )为例进行说明。尽管条件表达式中不另写 return( ) 语句,也可以得到函数体中 if 表达式的返回值,从而达到与包含 return( ) 同样的效
阅读全文
摘要:与很多编程语言一样,if 表达式用来处理逻辑条件。在 R 中,逻辑条件通常表达为某个表达式返回的单值逻辑向量。例如,我们可以写一个简单的函数 check_positive,如果输入一个正数则返回 1,否则不返回任何值:check_positive <- function(x) {if (x > 0)
阅读全文
摘要:赋值可能是所有编程语言中最基本的表达式了,它所做的就是将一个值(value)赋予或者绑定到一个符号上,使得我们能够通过符号来访问这个值。尽管编程语言之间有相似性,但 R 采用 <-符号来表示赋值。这和其他语言用 = 有点不同,虽然在 R 中也可以用 = 进行赋值:x <- 1y <- c(1, 2,
阅读全文
摘要:一些函数可以非常灵活,因为它们能够接受各种各样的输入值,满足广泛的需求。但是,很多情况下,更多的灵活性意味着增加更多的参数。如果使用一个非常灵活的函数,每次需要指定几十个参数,那么查看代码时肯定会觉得一片混乱。在这种情况下,给参数设定合理默认值,将会极大地简化调用函数的代码。使用 arg = val
阅读全文
摘要:函数是一个可以调用的对象。本质上讲,它是一个具有内在逻辑的机制,输入一组值(形参或实参),并依据其逻辑返回一个值。在前面的章节中,我们遇到过一些 R 的内置函数。例如,在 is.numeric( )函数中输入任意一个 R 对象,会返回一个判断该对象是否为数值向量的逻辑值。类似的还有is.functi
阅读全文
摘要:函数是用于解决一些特定问题的特定逻辑或者过程的集合的一种合理抽象,开发人员通常希望函数具有一般性,以适用于各种各样的场景。这样就可以轻松地使用它来解决相似的问题,而无需为每个问题编写过多的专用函数。泛化是使一个函数具有更广泛的适用性。在弱类型的编程语言(例如 R )中泛化函数非常方便的,但是当它被不
阅读全文
摘要:因为 R 中的函数不是强类型的,所以它可以非常灵活。换句话说,在调用函数之前,输入对象的类型是不固定的。即使函数的最初设计是针对标量运算,当将函数“+”作用到向量上时,它也会自动拓展以适用于向量运算。例如,我们可以运行以下代码,而不必对函数做任何其他修改:add(c(2, 3), 4)## [1]
阅读全文
摘要:就像在数学中一样,函数一旦定义了,就可以被调用。调用语法为:“函数名(参数 1, 参数 2, ...)”。请看如下示例:add(2, 3)## [1] 5调用函数的过程非常清晰。就像示例中调用函数,R 首先会在环境中查找是否存在一个名为 add 的函数,然后它会明白 add 是我们刚才创建的函数。之
阅读全文
摘要:在 R 中创建函数很容易。例如我们定义一个名为 add 的函数,将 x 和 y 相加:add <- function(x, y){x + y}上述函数的语法(x, y)指定了函数的参数。换句话说,此函数需要两个名为 x 和 y的参数。{ x + y }是函数体,包含了一系列由 x 和 y 及其他可用
阅读全文
摘要:数据框是指有若干行和列的数据集。它与矩阵类似,但并不要求每列都是相同的类型。这与最常见的数据形式是一致的:每行或每条记录由不同类型的列来描述。表 2-1 充分展示了数据框的特点。表 2-1姓名 性别 年龄 专业Ken Male 24 FinanceAshley Female 25 Statistic
阅读全文
摘要:现实中,数据通常存储在文件中。R 提供了许多函数以便从文件中读取一个表格或将一个数据框写入文件。如果一个文件储存了一个表格,通常它都会被很好地组织起来,即按照一定规则将行和列有序地排列。大多数情况下,我们不必逐个字节地读取文件,而是调用 read.table( )或 read.csv( )等函数。C
阅读全文
摘要:对一个数据框而言,有很多实用的函数,这里我们只介绍几个最常用的。summary( )函数作用在数据框上,将生成一个汇总表来显示每一列的情况:summary(persons)## Name Gender Age Major## Length:3 Female:2 Min. :23.0 Length:3
阅读全文
摘要:值得注意的是,在默认情况下,数据框会以更有效地利用内存的方式来存储数据。但有时,这种存储方式会导致意想不到的问题。例如,当我们用一个字符向量作为创建数据框的列时,R 会默认将其转换成因子,相同值只存储一次,以免重复存储占用过多内存。因子本质上是一个带有水平(level)属性的整数向量,其中“水平”是
阅读全文
摘要:处理列表和矩阵的两种方法都可以用来为一个数据框子集赋值。1.以列表方式赋值我们可以同时使用$和<-对列表中的成分重新赋值。df1$score <- c(0.6, 0.3, 0.2, 0.4, 0.8)df1## id level score## a 1 0 0.6## b 2 2 0.3## c 3
阅读全文
摘要:因为数据框是由列向量组成、有着矩阵形式的列表,所以我们可以用两种操作方式来访问数据框的元素和子集。1.以列表形式构建数据框子集如果把数据框看作是由向量组成的列表,我们可以沿用列表的操作方式来提取元素或构建子集。例如,可以使用$按列名来提取某一列的值,或者用[[符号按照位置提取。df1$id## [1
阅读全文
摘要:数据框既是列表的特例,也是矩阵的推广,因此访问这两类对象的方式都适用于数据框。df1 <- data.frame(id = 1:5, x = c(0, 2, 1, -1, -3), y = c(0.5, 0.2, 0.1,0.5, 0.9))df1## id x y## 1 1 0 0.5## 2
阅读全文
摘要:我们可以调用 data.frame( )函数,对每一列提供相应类型的列向量来创建一个数据框。persons <- data.frame(Name = c("Ken", "Ashley", "Jennifer"),Gender = c("Male", "Female", "Female"),Age =
阅读全文
摘要:列表(list)是一个广义的向量,它可以包含其他类型的对象,甚至可以包括其他列表。列表的灵活性使得它非常有用。举个例子,用 R 拟合一个线性模型,其结果本质上就是一个列表,其中包含了线性回归的详细结果,如线性回归系数(数值向量)、残差(数值向量)、QR 分解(包含一个矩阵和其他对象的列表)等。因为这
阅读全文
摘要:R 中有许多和列表相关的函数。例如,如果我们不能确定一个对象是否是列表,可以调用 is.list( )进行判断:l2 <- list(a = c(1, 2, 3), b = c("x", "y", "z", "w"))is.list(l2)## [1] TRUEis.list(l2$a)## [1]
阅读全文
摘要:在列表中赋值和给向量赋值一样直观:l1 <- list(x = 1, y = c(TRUE, FALSE), z = c("a", "b", "c"))l1$x <- 0如果给一个不存在的成分赋值,列表会自动地在对应名称或位置下增加一个新成分:l1$m <- 4l1## $x## [1] 0####
阅读全文
摘要:许多场合下,我们需要从列表中提取多个元素。由这些元素组成的列表构成了原列表的一个子集。构建一个列表子集,我们可以用单层方括号,就像提取向量和矩阵中元素一样。我们可以取出列表中的一些元素,然后放到一个新的列表中。这里方括号的用法与其在向量中的用法非常相似。我们可以用字符向量表示成分名称,用数值向量表示
阅读全文
摘要:无论在列表创建之初是否有为各列表成分命名,我们总能通过一个用于命名的向量,为这些列表成分命名或重命名。names(l1) <- c("A", "B", "C")l1## $A## [1] 1#### $B## [1] TRUE FALSE#### $C## [1] "a" "b" "c"若想移除它们
阅读全文
摘要:有许多方法可以提取列表中的元素。最常用的方法是使用美元符号$,通过成分的名称来提取列表元素的值。l1 <- list(x = 1, y = c(TRUE, FALSE), z = c("a", "b", "c"), m = NULL)l1$x## [1] 1l1$y## [1] TRUE FALSE
阅读全文
摘要:顾名思义,我们可以用 list( )创建一个列表。不同类型的对象可以被装进同一个列表中。例如,以下代码创建了一个列表,包含 3 个成分① :一个单元素的数值向量、一个两元素的逻辑向量和一个长度为 3 的字符向量:l0 <- list(1, c(TRUE, FALSE), c("a", "b", "c
阅读全文
摘要:数组是矩阵向更高维度的自然推广。具体来说,数组就是一个维度更高(通常情况下大于 2)、可访问的向量。如果你对向量和矩阵已经很熟悉,就不会对数组的操作方式感到诧异了。 创建一个数组 构建数组子集
阅读全文
摘要:从数组中提取子集的原理与矩阵完全相同。我们通过给每个维度提供一个向量来提取数组子集。a1[1,,]## k1 k2## c1 0 5## c2 1 6## c3 2 7## c4 3 8## c5 4 9a1[, 2,]## k1 k2## 1 6a1[,,1]## c1 c2 c3 c4 c5##
阅读全文
摘要:我们可以提供一个向量,然后调用 array( )函数来创建一个数组,指定数组的不同维度,有时也可以给出不同维度的行名和列名。假设数据是 0~9 这 10 个整数,需要将其分配到 3 个维度中,其中第 1 维长度为 1,第 2 维长度为 5,第 3 维长度为 2:a1 <- array(c(0, 1,
阅读全文
摘要:矩阵是一个用两个维度表示和访问的向量。因此,适用于向量的性质和方法大多也适用于矩阵。例如,每一种向量(例如数值向量或逻辑向量)都有对应的矩阵形式,即数值矩阵(numeric matrice)、逻辑矩阵(logical matrice)等。 创建一个矩阵 为行和列命名 构建矩阵子集 矩阵运算符的使用
阅读全文
摘要:所有适用于向量的算术运算符也适用于矩阵,就如同它们也是向量一样。这些运算符在元素上进行运算,除了一些矩阵专用的运算符,例如矩阵乘法%*%:m1 + m1## c1 c2 c3## r1 2 8 14## r2 4 10 16## r3 6 12 18m1 - 2 * m1## c1 c2 c3##
阅读全文
摘要:和处理向量一样,我们不仅需要创建矩阵,也需要从中抽取数据,这称为构建矩阵子集(matrix subsetting)。矩阵是用两个维度表示和访问的向量,可以用一个二维存取器(accessor)[ , ]来访问,这类似于构建向量子集时用的一维存取器[ ]。我们可以为每个维度提供一个向量来确定一个矩阵的子
阅读全文
摘要:在默认情况下,创建矩阵时不会自动分配行名和列名。当不同的行列有不同的含义时,为其命名就显得必要且直观。在创建矩阵时就可以为行和列命名:matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE, dimnames= list(c("r1",
阅读全文
摘要:我们可以调用 matrix( )函数将一个向量变成矩阵,方法是设定矩阵的其中一个维度。matrix(c(1, 2, 3, 2, 3, 4, 3, 4, 5), ncol = 3)## [,1] [,2] [,3]## [1,] 1 2 3## [2,] 2 3 4## [3,] 3 4 5设定 nc
阅读全文
摘要:一个向量是由一组相同类型的原始值构成的序列。它可以是一组数字、一组逻辑值、一组文本或者是其他类型的值。它是所有 R 对象的基础数据结构之一。在 R 中,有多种类型的向量,区别在于它们存储的元素类型互不相同。在接下来的小节中,我们将会看到最常使用的向量类型,包括数值向量、逻辑向量和字符向量。 数值向量
阅读全文
摘要:数值向量的算术运算很简单,主要遵循两个原则:对相应位置的元素进行计算,并自动循环利用较短的向量(循环补齐功能)。下面的例子展示了运算符对数值向量的作用方式:c(1, 2, 3, 4) + 2## [1] 3 4 5 6c(1, 2, 3) -c(2, 3, 4)## [1] -1 -1 -1c(1,
阅读全文
摘要:不同类型的向量可以被强制转换为一种特定类型的向量。例如,有些数据是数值字符串,如 1 和 20。如果不进行转换处理,就无法对其进行数值运算。幸运的是,这两个字符串可以转换为数值向量。转换后,R 就能够将它们识别为数值数据而不是字符串,这样我们就能对其进行数值运算了。在演示典型的向量类型转换之前,先创
阅读全文
摘要:有时我们需要在处理向量之前辨别向量的类型。class( )函数用于判断任意 R 对象的类型:class(c(1, 2, 3))## [1] "numeric"class(c(TRUE, TRUE, FALSE))## [1] "logical"class(c("Hello", "World"))##
阅读全文
摘要:[ ]能够创建一个向量子集,[[ ]]可以提取向量中的元素。我们可以将一个向量比作 10盒糖果,你可以使用[ ]获取其中的 3 盒糖果,使用[[ ]]打开盒子并从中取出一颗糖果。对于简单的向量,使用[ ]和[[ ]]取出一个元素会产生相同的结果。但在某些情况下,它们会返回不同的结果。例如,对于命名向
阅读全文
摘要:命名向量是一种不同于数值向量或逻辑向量的特定向量类型。它指的是该向量中的每一个元素都有相应的名称。我们可以在创建向量的同时对其命名:x <- c(a = 1, b = 2, c = 3)x## a b c## 1 2 3这样就可以通过单值字符向量来访问其中的元素:x["a"]## a## 1也可以通
阅读全文
摘要:如果想访问一些特定元素或者向量的一个子集,使用向量子集是一个不错的方法。在这一节中,我们将展示几种不同的构建向量子集的方法。首先,生成一个简单的数值向量并且赋值给 v1:v1 <- c(1, 2, 3, 4)接下来的每一行都是用来获取 v1 的特定子集。例如,提取第 2 个元素:v1[2]## [1
阅读全文
摘要:一个字符向量是由字符串组成的向量。这里的一个字符不是指着文学意义上的单独的字母或者符号,而是一个类似 this is a string 这样的字符串。双引号和单引号都可以用来生成字符向量,例如:"hello, world!"## [1] "hello, world!"'hello, world!'#
阅读全文
摘要:与数值向量不同,一个逻辑向量储存一组 TRUE 或 FALSE 值。它们基本上以“是”或“否”来表示对一组逻辑问题的回答。最简单的逻辑向量是 TRUE 或者 FALSE 本身:TRUE## [1] TRUE获得一个逻辑向量更一般的方法是询问关于 R 对象的逻辑性问题。例如,我们可以询问 R,1 是否
阅读全文
摘要:一个数值向量就是由数值组成的向量。单个数值(标量数值)就是最简单的数值向量。举一个例子:1.5## [1] 1.5数值向量是最常用的数据类型,也几乎是所有数据分析的基础。在其他流行的编程语言中,存在一些标量类型,例如整型、双精度型和字符串型。这些标量是构成如向量等其他容器类型的基础。然而,在 R 中
阅读全文
摘要:Matlab中支持的数据类型包括: 逻辑(logical)字符(char)数值(numeric)元胞数组(cell)结构体(structure)表格(table)函数句柄(function handle) 1、逻辑型(logical) 该类型变量值为1或0。 2、字符型(char) Matlab的字
阅读全文
摘要:数据类型 1数值类型 @整数 *浮点型转整数型的转换函数,将数值转换为最为接近的整数值,若分数部分为0.5时,转换为最接近的两个整数中绝对值较大的一个。 *取整函数: floor(x)向下取整 ceil(x)向上取整 round(x)取最接近的整数 fix(x)向0取整 @浮点数类型 系统默认的数值
阅读全文
摘要:用git config配置 Git,要做的第一件事就是设置名字和邮箱地址: 从现在开始,你会了解到一些类似以上但更为有趣的设置选项来自定义 Git。 先过一遍第一章中提到的 Git 配置细节。Git 使用一系列的配置文件来存储你定义的偏好,它首先会查找/etc/gitconfig文件,该文件含有 对
阅读全文
摘要:基本元素 首先cmaklist必须包括以下几个部分: #工程名 project(study_case) #cmake最低版本需求 cmake_minimum_required(VERSION 2.8.3) #添加添加需要的库 set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_
阅读全文
摘要:方案一: 当输入错误链接错误或者找不到页面,在router里可以定义一个404页面,具体可以这样做:在routes里面这样写: 注意:一定要写在routes的最后面! 方案二 在入口js文件使用了axios的拦截器
阅读全文
摘要:C++ Web 编程 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。 CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接口(CGI),是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的
阅读全文
摘要:大家都知道H5页面怎么在手机浏览器里测试,但是如何能打包成APP测试呢?因为本人的手机是IOS系统,如果用Xcode打包需要开发证书,貌似99美元一年。意外发现一个叫Hbuild的软件,简单好用,下面做个简单的使用分享: 首先到网上下载一个Hbuild,下载地址(windows) 一、安装成功后打开
阅读全文