参考资料:学习R
1、数学运算符和向量
运算符+执行加法,除了把两个数字相加之外,还可以把两个向量相加。向量是数值的有序集,在统计学中极其重要,因为通常的分析对象是整个数据集,而不是一条数据。
冒号运算符 : 能创建一个从某个数值开始到另一个数值结束的序列。而c函数则会把一系列的值拼接起来创建向量(这里c是concatenate的第一个字母,意思是“把所有东西连接在一起”)。
R中的变量名是区分大小写的,大写的C函数与小写的c函数作用完全不同。
在R中,向量化有几种含义,其中最常见的含义是:运算符或函数能作用于向量中的每个元素,而无需显式地编写循环语句(这种内置的基于元素的隐式循环也远远快于显式地写循环语句)。向量化的第二个含义是:当一个函数把一个向量作为输入时,能计算汇总统计:
向量化的第三种含义不太常见,即参数的向量化,例如当函数根据输入参数计算汇总统计时。
在R中,不只是加号(+),其他所有算术运算符都是向量化的。如下:
# 求和
sum(1:5)
# 求中位数
median(1:5)
# 减法
c(2,3,5,7,11,13)-2
# 乘法
-2:2*-2:2
# 求幂用^或**
identical(2^3,2**3)
# 浮点数除法
1:10/3
# 整除
1:10 %/% 3
# 取余
1:10 %% 3
R包含了多种数学函数。有三角函数(sin、cos、tan,以及相反的asin、acos和atan)、对数和指数(log和exp)。
要比较整数值是否相同需要用==而不是=。要检验是否不想等,运算符为!=。大于和小于号就是>和<。大于等于就是>=,小于等于就是<=。
使用 == 来比较非整型变量可能会带来问题。 到目前为止。 我们处理的所有数字都是浮点数。 这意味着, 对于两个数 a 和 b 来说, 它们可存储为 a * 2 ^ b。 由于它们都以 32 位存储, 所以只能是一个近似值。 这意味着舍入误差(rounding error) 会常常潜伏在你的计算之中, 你预期的答案可能是完全错误的。如下:
R还提供了all.equal函数用于检查数字是否相等。它提供了一个容忍度(tolerance level,默认情况下是1.5e-8),因而那些小于此容忍度的舍入误差将被忽略。
要检查两个数字是否一样,尽量不要使用==,而使用all.equal()函数。
我们也可以使用==来比较字符串。在这种情况下,比较会区分大小写,所以字符串必须完全匹配。
2、变量赋值
在给变量赋值之前,并不需要声明它们,R中没有声明这个概念。
变量名可包含字母、数字、点和下划线,但它不能以数字或一个点后跟数字(因为看起来太像一个数字)开头。系统的保留字也不是允许的,如if和for。
赋值运算符两边的空格并不是必须的,但它们有助于提高代码的可读性。尤其是对于<-来说,两边的空格可以轻松将它与小于号区分开。
我们还可以使用<<-来对全局变量赋值。只需把它看做创建了一个可在任意地方使用的变量。
注意,当我们对一个变量赋值时,不会马上看到值时多少。要看到变量包含的值,只需在命令提示符下键入其名称即可将其打印出来。
如果我们想把赋值和打印语句都写在同一行,有两种选择。第一,把多个语句放在一行,中间用 ; 分开。第二,把赋值语句写在括号()中。如下:
3、特殊数字
为了帮助算术运算,R支持4中特殊值:Inf,-Inf,NaN和NA。前两个是正负无穷。NaN为(not-a-number)的缩写,它意味着我们的计算或没有数学意义,或无法正确执行。NA是(not available)的缩写,并代表着缺失值。
4、逻辑向量
当我们启动R时,变量T和F已被系统默认定义为TRUE和FALSE。虽然这样能少打点字,但也造成很大的问题。T和F不是系统的保留字,因此用于可以重新定义它们。
R中有3个向量化逻辑运算符
!代表非操作
&代表与操作
|代表或操作
我们可编出一些真值表来看看它们是如何工作的(请不用管这段代码是否有意义, 只需集中精力去理解每个值是如何在真值表中计算出来的) :
# 三个逻辑值
x<-c(TRUE,FALSE,NA)
# 取得x和y的所有组合
xy<-expand.grid(x=x,y=x)
# 在xy内进行赋值
within(
xy,
{
and<-x&y
or<-x|y
not.y<-!y
not.x<-!x
}
)
其他两个比较有用的处理逻辑向量的函数是any和all,输入向量中至少包含一个TRUE值或只包含TRUE值,他们将分别返回为TRUE。
none_true<-c(FALSE,FALSE,FALSE)
some_true<-c(FALSE,TRUE,FALSE)
all_true<-c(TRUE,TRUE,TRUE)
any(none_true)
any(some_true)
any(all_true)
all(none_true)
all(some_true)
all(all_true)