R导论学习笔记(二):算术操作和向量运算

1
2
3
4
5
6
7
8
假如我们要创建一个含有五个数值的向量x,且这五个值分别为10.4,5.6,3.1,6.4 和21.7,则 R 中的命令为

> x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
赋值也可以用函数assign() 实现。下面的命令和前面的赋值命令等价:

> assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))进一步的赋值,会创建一个含有11个元素的向量y,其中包括两份x 拷贝和位于中间的一个0。

> y <- c(x, 0, x)
1
2
3
4
在算术表达式中使用向量将会对该向量的每一个元素都进行同样算术运算。出现在同一个表达式中的向量最好是长度一致。如果他们的长度不一样,该表达式的值将是一个和其中最长向量等长的向量。表达式中短的向量会被循环使用(recycled)(可能是部分的元素)以达到最长向量的长度。利用前面例子中的变量,命令

> v <- 2*x + y + 1
将产生一个新的长度为11的向量v。它由2*x 重复2.2次,y 重复一次,1 重复11次得到的向量相加而成。
1
`sum(x)给出x 中元素的累加和, 而prod(x) 则得到它们的乘积。var(x)则计算样本方差`
1
如果var() 的参数是一个n×p 的矩阵,则将该矩阵行与行之间看作是相互独立的p-变量的样本向量,从而得到一个p×p 的样本协方差矩阵。
1
2
3
4
5
函数seq() 是数列生成中最为常用的工具。它有五个参数,起始的两个参数,表示一个数列的首尾。如果只是给定这两个值,则和冒号运算符的效果完全一样了。前两个参数就可以用from=value 和to=value 方式设定;

因此seq(1,30),seq(from=1, to=30),seq(to=30, from=1) 同1:30 完全一样。seq() 随后的两个参数是by=value 和length=value;它们分别表示这个数列的步长和长度。如果二者没有设定,默认值就是by=1(步长为1)。

> seq(-5, 5, by=.2) -> s3
1
2
3
4
5
还有一个相关的函数是rep()。 它可以用各种复杂的方式重复一个对象。最简单的方式是

> s5 <- rep(x, times=5)这种方式先把x 的完整拷贝五次,保持x 的数列顺序,逐一放在s5 中。另一种有用的方式是

> s6 <- rep(x, each=5)这种方式把x 中的每个元素都重复五次,然后将重复五次的元素逐一放入
1
2
3
逻辑向量元素可以被赋予的值有TRUE,FALSE 和NA (“不可得到”)逻辑向量可以由条件式(conditions)产生。例如

> temp <- x > 13 # 得到TRUE or FALSE
1
`函数is.na(x) 返回一个和x 同等长度的向量。它的某个元素值为TRUE 当且仅当x中对应元素是NA。`
1
`特别要注意的是逻辑表达式x == NA 和is.na(x) 完全不同。因为NA 不是一个真实的值而是一个符号以表示某个量是不可得到的, 因此x == NA 得到的是一个长度和x一致的向量。它的所有 元素的值都是NA.`
1
`总之,对于NA 和Na N(数学上无法计算得到) 用is.na(xx) 检验都是 TRUE。为了区分它们,is.nan(xx)就只对是Na N 元素显示TRUE。`
1
`通过函数c() 可以把几个字符向量连接成一个字符向量;函数paste() 可以有任意多的参数,并且把它们一个接一个连成字符串。这些参数中的任何数字都将被显式地强制转换成字符串,而且以同样的方式在终端显示。默认的分隔符是单个的空格符,不过这可以被指定的参数修改。参数sep=string 就是将分隔符换成string,这个参数可以设为空。例如,> labs <- paste(c("X","Y"), 1:10, sep="")使得labs 变成一个字符向量。c("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10")`
1
`负整数向量索引。这种索引向量指定被排除的元素而不是包括进来。> y <- x[-(1:5)]            #将x 除开始五个元素外的其他元素都赋给y。`
1
2
3
4
5
字符串向量索引,这可能仅仅用于一个对象可以用names 属性来识别它的元素。

> fruit <- c(5, 10, 1, 20)
> names(fruit) <- c("orange", "banana", "apple", "peach")
> lunch <- fruit[c("apple","orange")]
-------------Thanks for Reading!-------------