Advertisement

R语言学习——向量

阅读量:

向量是R语言最基本的数据类型。

向量中可以包含数值、字符串或者逻辑值,但不能由多种格式混合组成。

如果向量的参数是自身,那么c(...)命令会将多个向量和为一个向量。

**
**

**

** 如果一个向量中同时包含数值和字符串,R会将数值数据转化为字符串。

x <- c(1, 2, 4, 9)

x <- c(x[1:3], 88, x[4]) # 在末尾位置插入一个数值88后可以看到:通过x[4]我们可以获取第四个元素;取前三个元素时会使用x[1:3];如果我们使用x[-4]则能够获取除了第四个元素之外的所有其他元素。

**

**

typeof(x) #查看向量里的元素的类型(细类),注意默认是double。[1] "double"

mode(x) #r语言中变量类型称为模式(mode)。[1] "numeric"

class(x) #查看变量的类。[1]"numeric"

R不需要提前申明变量,大小写敏感,数组是从1开始。

冒号运算符

1:4 #R属于一类函数式编程语言,在#R中使用冒号也是一种运算符(实际上这是一种中置运算符的表示法),用于生成一系列数据。[1] 1 2 3 4

):(1, 4) #其效果与1:4相同。以这种方式表示称为一种函数名。然而这样的表示方式显得不太常见。

5:1 #结果:[1] 5 4 3 2 1

1:10 - 1 #冒号的优先级比加减运算要高,实际上就是(1:10) - 1,结果: [1] 0 1 2 3 4 5 6 7 8 9

1:(10-1) #结果:[1] 1 2 3 4 5 6 7 8 9

循环补齐recycle

y <- c(1,2,3) + 4 # 单个的数值4会被补齐为c(4,4,4),最后结果为c(5,6,7)

计算结果为[4\quad 10\quad 18]时,在R语言中使用c(1:3)c(4:6)进行运算得到这一结果。具体来说,在R语言中,默认情况下c(x,y,z)会生成一个包含x, y, z三个元素的行向量。因此,在R语言中使用c(1:3)c(4:6)进行运算即为将这两个向量中的各个元素依次相乘。为了计算这两个向量之间的点积(dot product),我们需要使用这个%*%运算符。

c(1,2,3) %*% c(4,5,6) #结果是一个1x1的矩阵,其中只有一个元素14

c(1,2,3) * c(4,5,6,7) #结果:[1] 4 10 18 7。同时给出警告信息:长的对象长度不是短的对象长度的整倍数

取模运算%%

c(7,8,9) %% 3 #结果:[1] 1 2 0

向量索引

通常情况下,在常规语言环境中(或常见语言环境中),索引仅限于正整数值。然而,在当前语境下,“指标”不仅可以表示位置信息(即向量),还可以取负值。严格来说,并不能简单地将其视为传统的索引概念。

x <- c(1,3,5,7,9)

x[2] #结果:[1] 3

x[c(5,4,3,2,1)] #结果为:[1] 9 7 5 3 1

x[sample(1:5)] #把1,3,5,7,9乱序排列,每次运行你会得到一个不同的结果

x[-1] #[1] 3 5 7 9,把第一个元素除掉,x[-n]即为去掉第n个元素

x[1:3] #结果:[1] 1 3 5

seq()创建向量

seq(from=12, to=30, by=3) # 也可以写成: seq(12,30,3)

[1] 12 15 18 21 24 27 30

seq(from=1.1, to=2, length=10)

[1] 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0

x <- c(1,2,4,8)

seq(x)

[1] 1 2 3 4

seq(1,5)与1:5是一个意思

rep重复向量常数

rep(8, 4)

[1] 8 8 8 8

rep(1:3, 2)

[1] 1 2 3 1 2 3

rep(1:3, each=2)

[1] 1 1 2 2 3 3

all()和any()

x<-(1:10)

any(x>8) #只要向量中有一个大于8,就返回真

[1] TRUE

all(x>8) #所有都大于8,才返回真

[1] FALSE

向量化

w是一个自定义的函数\texttt{function}(x),它通过简单的加法运算实现了\texttt{vectorized}处理功能。#由于加号运算符本身具备\texttt{vectorized}特性(即支持对多个数值同时执行计算),因此自定义的函数w同样具备这一特性。\尽管这个过程看似简单(看似简单的x+1运算实际上已经构建了一个高效的\texttt{vectorized}计算框架),但我们已经将这一逻辑封装成了一个简洁易用的功能模块。

w(1) #这是我们最熟悉的函数调用

[1] 2

w(c(1,3,5)) #可以对向量进行运算

[1] 2 4 6

NA与NULL

在统计过程中,经常会遇到缺失值,称为NA,即Not Available。

R语言中许多函数可以忽略NA值。

x <- c(1,2,NA,4)

mean(x) #有缺失值,无法计算平均值

[1] NA

mean(x, na.rm=TRUE) #忽略NA值

[1] 2.333333

mean(c(1,2,NULL,4)) # NULL值会自动略过

[1] 2.333333

探测数据中的NA,可以用is.na()函数,它将返回一个逻辑向量。

**

**

**

**

缺失值的概念是指应该有数据而没有的情况,在数据处理中充当占位符的角色。空值的存在性意味着该位置实际上不存在数据。有时空值也可以用于快速删除复杂对象中的一个元素。

data_list$list <- NULL

length(c(1,2,NA,4)) #统计个数时NA被计算在内

[1] 4

length(c(1,2,NULL,4))

[1] 3

筛选filtering

有点像索引,因为也是放在[]里,可以把满足一定条件的元素取出来。

z <- 1:10

z

[1] 1 2 3 4 5 6 7 8 9 10

z[z%%2==0]

[1] 2 4 6 8 10

z%%2 #取模

[1] 1 0 1 0 1 0 1 0 1 0

z%%2==0 #注意这里的0被自动循环补齐

[1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE

x<-c(1,3,5,6,9)

x[x>3] <- 0 #把大于3的数值都置为0

x

[1] 1 3 0 0 0

subset也是筛选,区别在于处理NA的方式上

x<-c(1,2,NA,4,5)

x[x>3]

[1] NA 4 5

subset(x, x>3) #自动把NA剔除掉了

[1] 4 5

which()可以找到满足条件的元素的位置

x <- c(5, 2, -3, 9, 1)

x[x*x>8]

[1] 5 -3 9

which(x*x>8)

[1] 1 3 4

向量化的ifelse()

x <- c(5, 2, -3, 9, 1)

ifelse(x>3, 2x, 3x) #>3的元素执行2,其余执行3

[1] 10 6 -9 18 3

判断向量是否相等

x <- 1:3

y <- c(1,3,4)

all(x==y)

[1] FALSE

identical(x,y)

[1] FALSE

注意1:3是整数,c(1,2,3)是浮点数,它们不相等

identical(1:3, c(1,2,3))

[1] FALSE

typeof(1:3)

[1] "integer"

typeof(c(1,2,3))

[1] "double"

给向量元素命名names()

workdays <- 1:5

names(workdays) <- c("mon", "tue", "wed", "thu", "fri")

workdays

mon tue wed thu fri

1 2 3 4 5

可以用名称来引用元素

workdays["wed"]

wed

3

PS:笔记主要参考内容为申龙斌的《程序人生》,链接为http://www.cnblogs.com/speeding/p/3537947.html;其中一部分内容来自《数据科学中的R语言》以及《R语言经典实例》两本书籍。

全部评论 (0)

还没有任何评论哟~