R的初学者指南:你想知道的语法怪癖

我们的动手指南的第5部分介绍了一些你需要理解的R谜题。

为什么x=3不总是意味着你认为它应该,关于数据类型和更多。

我提到的在一开始这种语法有点古怪,尤其是如果您的参考框架是,嗯,几乎是任何其他编程语言的话。下面是这门语言的一些不寻常的特点,在你开始学习R的时候,理解它们可能会有用。

这个故事是计算机世界的“R.初学者指南”的一部分。To read from the beginning, check out介绍;该页面上有本系列其他作品的链接。

给变量赋值

在我所知道的几乎所有其他编程语言中,等号为变量赋值。x = 3意味着x现在是3。

在r中不是这样的,至少,不一定。

在R中,主要赋值运算符为<-,如:

x < - 3

而不是:

x = 3

为了增加潜在的混淆,等号实际上可以在R中用作赋值操作符——但不是一直都可以。什么时候可以使用它,什么时候不可以?

初学者处理这个问题的最好方法是使用首选的赋值操作符<-,而忘记等号是允许的。嘿,如果足够好的话谷歌的R风格指南——他们建议不要使用等号给变量赋值——这对我来说已经足够好了。

(如果这对你来说不是一个足够好的解释,然而,你真的真的想知道R的5个细节,是的,数一数,5个分配选项,看看R手册的赋值操作符页)。

关于变量还有一点需要注意:R是一种区分大小写的语言。变量x和x不一样这适用于R中的所有东西;例如,函数子集()与子集()不同。

c代表组合(或连接,有时是转换/强制)。

当你在大多数编程语言中创建一个数组时,语法是这样的:

myArray = array(1, 1, 2, 3, 5, 8);

或者:

int myArray = {1,1,2,3,5,8};

或者:

myArray = [1, 1, 2, 3, 5, 8]

但是在R中,还有一个额外的部分:要将多个值放入一个变量中,需要使用c()函数,例如:

my_vector <- c(1,1,2,3,5,8)

如果您忘记了C,你会得到一个错误。当你R中开始了,你可能会看到错误与遗漏了是c()了很多。(至少我肯定没有。)

现在我已经强调了c()函数的重要性,我(不情愿地)告诉你,有一种情况下,你可以不使用它——如果你引用的是一个连续的值在一个冒号之间的最小和最大值,像这样:

my_vector < - (1:10)

我之所以提出这个异常,是因为我在R教程和文本中经常碰到这种样式,而且看到c对某些多个值是必需的,而对其他值则不需要,这可能会让人感到困惑。注意,使用带有冒号分隔的范围的c不会造成任何伤害,即使它不是必需的,例如:

my_vector < - c (1:10)

关于c()函数的另一个非常重要的一点是:它假设向量中的所有东西都是相同的数据类型——即,所有数字或所有字符。如果你创建一个矢量,如:

my_vector <- c(1,4, "hello", TRUE)

你不会有两个整数对象,一个角色对象与一个逻辑对象的向量。相反,C()将竭尽所能,将它们全部转换成所有相同的对象类型,在这种情况下,所有字符对象。所以my_vector将包含 “1”, “4”, “你好” 和 “TRUE”。换句话说,C()也为“转换”或“裹胁”。

要创建具有多个对象类型的集合,您需要一个列表,而不是一个向量。使用list()函数创建一个列表,而不是c()函数,例如:

My_list <- list(1,4,"hello", TRUE)

现在您已经有了一个变量,它包含数字1、数字4、字符对象“hello”和逻辑对象TRUE。

Loopless循环

使用“for”和“while”之类的循环迭代数据集合是许多编程语言的基石。但这不是正确的方法。而R有for, while和重复循环,您更可能看到使用apply()函数或plyr()附加包函数对数据收集应用操作。

但首先,我要讲一些基础知识。

如果你有一个矢量的数字,例如:

my_vector < - c(5) 7日,9日23日

如果你想把它们都乘以0。01变成百分数,你会怎么做呢?您不需要for、foreach或while循环。相反,您可以创建一个名为my_pct_vectors的新向量,如下所示:

my_pct_vector <- my_vector * 0.01

对向量变量执行数学操作将自动遍历向量中的每一项。

但是,通常在数据分析中,您希望将函数应用于数据子集:按职位查找平均工资或按社区查找财产值的标准偏差。apply()函数组和plyr附加包就是为此设计的。

根据操作的数据对象类型和返回的数据对象类型,apply家族中有超过6个函数。“要想完全按照你的预期使用这些功能,有时会非常困难,尤其是对刚开始使用R的人来说。博客文章在革命分析,主要关注企业级R。

普通的apply()在所有列都是相同数据类型的2维矩阵的每一行或每列上运行一个函数。对于2d矩阵,还需要告诉函数是按行应用还是按列应用:添加参数1以按行应用,或添加参数2以按列应用。例如:

应用(my_matrix 1位数)

返回my_matrix和中每一行的中值

应用(my_matrix 2位数)

计算每列的中值。

apply()系列中的其他函数(如lapply()或tapply())处理不同的输入/输出数据类型。澳大利亚统计生物信息学家尼尔·f·w·桑德斯有一个很好的在R中的应用简介如果你想了解更多并看到一些例子,请在博客上发表。(如果你想知道,生物信息学涉及存储、检索和组织生物数据,而不仅仅是分析它。)

许多不喜欢apply函数的用户并不使用for循环,而是安装Hadley Wickham创建的plyr包。他使用他所谓的“分解-应用-结合”数据处理模型:按照你想要的方式分解数据集合,对每个数据组应用你想要的任何功能,然后将它们重新组合在一起。

plyr包可能已经超出了基本的初学者指南;但如果你想了解更多关于plyr的信息,你可以前往韦翰plyr网站。还有一个关于plyr的有用幻灯片演示卡耐基梅隆大学统计学副教授Cosma Shalizi和Vincent Vu提供的PDF格式。另一个在plyr上的PDF演示是从R工作坊简介在爱荷华州立大学。

R数据类型概述(非常简要)

作为初学者,您是否应该一开始就了解R的所有数据类型以及它们的行为方式?如果您的目标是成为R忍者,那么,是的,您必须了解数据类型的来路。但我的假设是,在深入创建复杂代码之前,您在这里尝试生成快速图和统计数据。

因此,为了从基础开始,我建议您现在记住以下内容:R有多种数据类型。其中一些在做基础数据工作时特别重要。有些函数对于基本数据工作非常有用,它们要求数据具有特定的类型和结构。

更具体地说,R具有“它是整数还是字符或真/假?”的数据类型,这是基本的构建块。R包括整数、数字、字符和逻辑。缺失的值由NaN(如果数学函数不能正常工作)或NA(缺失或不可用)表示。

如前一节所述,您可以有一个矢量具有相同类型的多个元素,例如:

1、5、7

“比尔”、“Bob”、“苏”

单个数字或字符串也是一个向量——向量为1。当你访问一个只有一个值的变量,比如73或“在Computerworld.com了解更多关于R的信息”,你也会在你的控制台看到这个值之前:

[1]

这告诉你你的屏幕打印从向量项1开始。如果您有一个包含许多值的向量,因此打印输出将跨多行运行,那么每行将以括号中的数字开始,告诉您特定行以哪个向量项号开始。(见下图截图)

如果您有一个包含许多值的向量,因此打印输出将跨多行运行,那么每行将以括号中的数字开始,告诉您特定行以哪个向量项号开始。

如果你想混合数字和字符串或数字和真/假类型,你需要一个列表。(如果您不创建一个列表,那么您可能会对包含(3,8,"small")的变量被转换为字符向量("3","8","small")感到不快。)

顺便说一下,R假设3和3.0是同一个类——数值的。,加上一个小数点)。如果需要整数3,则需要将其表示为3L或使用as.integer()函数。在这种情况下,你可以使用class()函数来检查你得到的数字类型:

类(3)

类(3.0)

类(3 l)

类(as.integer (3))

有几个as()函数用于将一种数据类型转换为另一种数据类型,包括as.character()、as.list()和as.data.frame()。

R还具有在分析数据时特别感兴趣的特殊向量和列表类型,如矩阵和数据框架。矩阵具有行和列;您可以使用dim()找到一个矩阵维,例如

暗(my_matrix)

一个矩阵需要在每一列中都有相同的数据类型,比如到处都是数字。

数据框架类似于矩阵,只是一列和另一列的数据类型不同,而且每一列都必须有名称。如果数据的格式可以很好地用作数据库表(或格式良好的电子表格表),那么它也可以很好地用作R数据框架。

在数据框架中,可以将每一行看作数据库记录,将每一列看作数据库字段。有许多有用的函数可以应用于数据帧,其中一些函数我在前面的小节中已经介绍过,比如summary()和psych包的describe()。

说到奇怪的地方:有几种方法可以找到对象的底层数据类型,但并不是所有方法都返回相同的值。例如,class()和str()将在数据框架对象上返回data.frame,但是mode()将返回更通用的列表。

如果您想了解有关R数据类型的详细信息,您可以观看由罗杰·彭,在公共卫生约翰霍普金斯大学彭博学院生物统计学副教授这样视频讲座:

约翰霍普金斯大学彭博公共卫生学院的生物统计学副教授Roger Peng解释了R。

还有一个有用的概念来结束本节——坚持下去,我们差不多完成了:因子。这些表示数据中的类别。如果你有一个关于员工,他们的部门和他们的薪水的数据框架,薪水将是数字数据而员工将是字符(很多其他语言的字符串);但是您可能希望department成为一个因素——换句话说,一个您可能希望根据其对数据进行分组或建模的类别。因素可以是无序的,比如部门,也可以是有序的,比如“差”、“公平”、“好”和“优秀”。

命令行不同于Unix shell

当您开始在R环境中工作时,它看起来非常类似于Unix shell。实际上,如果您来自Unix环境,有些命令行操作的行为与您预期的一样,而其他操作则不是这样。

想要循环您的最后几个命令吗?在R中,向上箭头的工作方式与在Unix中一样——单击它可以查看之前的命令。

列表函数ls()将提供一个列表,但不像Unix中那样提供文件列表。相反,它将提供当前R会话中的对象列表。

想要查看当前的工作目录吗?pwd只是抛出一个错误;您需要的是getwd()。

rm(my_variable)将从当前会话中删除一个变量。

R包含一个类unix的grep()函数。有关在R中使用grep的更多信息,请参阅本文简要介绍正则表达式与R语言在regular-expressions.info。

终止你的表达式

R不需要分号来结束一行代码(尽管可以将多个命令放在一行中,用分号分隔,但这种情况并不常见)。相反,R使用换行符(即。)来确定表达式何时结束。

如果你想让一个表达式跨越多行呢?R解释器尝试猜测您的意思是让它继续到下一行:如果您显然没有在一行上完成命令,它将假定您想继续,而不是抛出错误。打开括号而不关闭括号,使用开引号而不关闭引号,或者用+或-之类的操作符结束一行,R将等待执行命令,直到遇到预期的结束字符,否则命令看起来就完成了。

语法作弊:在R中运行SQL查询

如果你有SQL经验和R语法开始给你头痛,特别是当你试图找出如何让数据通过适当的R语法的一个子集——你可能会渴望能够运行一个快速的SQL SELECT命令查询您的数据集。

你可以。

相关:
12 第1页
第1页共2页
工资调查:结果在