R中向量基本操作:创建、运算、访问

本文含有:

  • 向量的创建与运算
  • 两个方便创建向量的函数:rep()与seq()
  • 如何访问向量中的元素

首先先明白几个要点:

  • R区分大小写,向量A和向量a是两个不同的向量;
  • R可以识别负数,如5+-2可以输出结果3
  • R是计数时是1-base,也就是说R中的1就代表第一个数,而其他语言有可能第一个数用0来表示。
  • R的赋值符号可以是“<-”,也可以是“=”。

1. 向量的创建与运算

  • 创建一个向量
> l <- c(2, 2, 1, 3, 8)
> l
[1] 2 2 1 3 8
  • 创建一个1至5的向量,“:”表示“至”,“1:5”则表示从1到5的5个整数。
> n <- 1:5
> n
[1] 1 2 3 4 5

也可以用函数vector(length=)创建向量。创建的向量初始默认为逻辑值FALSE

> v <- vector(length = 4)
> v
[1] FALSE FALSE FALSE FALSE
  • 切片运算(这也是访问向量的一种方式)
    注意R中的序号1就表示第1个,而不是2个,要与python相区别
n[1:4]
[1] 1 2 3 4
  • 基本运算
    首先肯定是用+, -, *, /这几个运算符号进行的。幂运算使用^,带括号先算括号内的内容。用刚刚创建的n和a列表进行示范:
> a1 <- l + n
> a1
[1]  3  4  4  7 13

> a2 <- l / n
> a2
[1] 2.0000000 1.0000000 0.3333333 0.7500000 1.6000000

a和n是等长的,即向量内元素的个数是一样的,得到的运算结果也是一一对应相运算的结果。若不等长会怎么样呢?
较少元素的向量在运算完一遍以后将会重新对应较多元素的向量中的剩余元素逐个再从头运算一次。这句话比较难理解,看例子:

> n <- 1:5
> l <- c(1,1,1,1,1,2,2,2,2,2)
> a <- n * l 
> a
 [1]  1  2  3  4  5  2  4  6  8 10

2.seq函数 - 建立等差数列

建立从2到10,间隔为2的等差数列:

> n <- seq(from=2, to=10, by=2)  # 或 n <- seq(2, 10, 2)
> n
[1]  2  4  6  8 10

如果换成1到11,间隔为2的等差数列会怎么样呢?答案是11会被剔除。

> n <- seq(2, 11, 2)
> n
[1]  2  4  6  8 10

3. rep函数 - 元素的重复

两种格式:

  • rep(起始值:终止值, times = 重复次数)
  • rep(起始值:终止值, each = 重复次数)
    第一种是将整一个向量重复n次;
    第二种是将向量的每个元素依次重复n次;
    若直接写数字,则是第一种times.
    见下面例子:
> x=1:4
> rep(x,2)
[1] 1 2 3 4 1 2 3 4

第一行代码表示把1到4赋值给x,第二行表示把向量x重复2次。当然我们也可以直接写入数字:

> rep(1:4,2)
[1] 1 2 3 4 1 2 3 4

当然,向量可以重复,字符也是可以重复的,但是不要忘记加个引号,例如,如果我们想把字符“male”和“female”各重复10次,那么我们输入下面的代码:

> rep(c("male","female"),each=10)
 [1] "male"   "male"   "male"   "male"   "male"   "male"   "male"   "male"  
 [9] "male"   "male"   "female" "female" "female" "female" "female" "female"
[17] "female" "female" "female" "female"

先用c()函数将“male”和“female”结合成一个向量,each=10是将向量中每一个元素重复10次。如果不写each=10,直接写10,将会是这样的:

> rep(c("male","female"),10)
 [1] "male"   "female" "male"   "female" "male"   "female" "male"   "female"
 [9] "male"   "female" "male"   "female" "male"   "female" "male"   "female"
[17] "male"   "female" "male"   "female"

注意它和前一个代码重复的区别。再强调一次,第一个是将向量中的每一个元素重复十次,第二个是将整个向量重复了10次。

> rep(c(1,2),c(10,10))
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2

这样写也表示把1,2各重复10次。因此,我们显然可以想到,如果把1,2,3,4分别重复5,6,7,8次,代码一定是这样的:

> rep(c(1,2,3,4),c(5,6,7,8))
 [1] 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4

与seq函数一样,rep函数也可以设置长度。

> rep(1:7,3)
 [1] 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7

> rep(1:7,3,length.out=18)
 [1] 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4

比较这两组代码与结果。第一个表示将1到7重复3次,得出了21个值,第二个表示将1到7重复3次,限制长度为18,所以结果只有18个值。同样,length.out也可以简写为length或len。

当我们在rep中使用each时,还可以使用times

> rep(c(3,5,7),each=3,times=2)
 [1] 3 3 3 5 5 5 7 7 7 3 3 3 5 5 5 7 7 7

代码表示将向量中的每个元素重复三次,再将所得的结果重复2次(结合结果,仔细理解我这句话),“times”即“加倍”的意思。
最后想删除向量x:

rm(x)

4.访问向量中的元素

(1)访问指定位置上的元素

有三种书写格式:

  • 向量名[位置常量]
  • 向量名[位置常量1:位置常量2]
  • 向量名[c(位置常量列表)]
> v <- vector(length = 10) #创建10元素向量v
> v
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> v[1] <- 1 # 访问第1个元素,赋值为1
> v[2:4] <- c(2,3,4) # 访问第2~4个元素,赋值为2,3,4
> v
 [1] 1 2 3 4 0 0 0 0 0 0
> w <- seq(5,9,1) # 生成一个取值为5~9的序列给向量w
> v[c(5:9,10)] <- c(w,10) # 访问第5~9和第10个元素,赋值为5~10
> v
 [1]  1  2  3  4  5  6  7  8  9 10

这个c(w, 10)的访问方式,可以有效实现多个向量的合并。

(2)利用位置向量访问指定位置上的元素
> v
 [1]  1  2  3  4  5  6  7  8  9 10
> w <- (2:4)
> v[w]
[1] 2 3 4

要注意这个w的赋值没有用c函数。
除了直接指定位置,也可以利用逻辑型位置向量来访问。

> w <- c(T,F,F,T,F,F,F,F,F,F)
> v[w] # 访问v中位置向量w取值为TRUE位置(即1,4)上的元素
[1] 1 4
(3)访问指定位置之外的元素

加个负号就可以实现

> v[-1] # 访问除了第1个元素以外的元素
[1]  2  3  4  5  6  7  8  9 10 
> v[-(2:4)] # 访问除了2~4元素以外的元素
[1]  1  5  6  7  8  9 10
> v[-c(5:9,10)]
[1] 1 2 3 4

如果尝试逻辑型位置向量呢?会出现问题:

> w
 [1]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
> v[-w]
[1]  2  3  4  5  6  7  8  9 10

本文参考:《R语言数据挖掘》第2版 薛薇 编著

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,498评论 1 51
  • 为什么,一天天下来,感觉自己没有什么进步呢?哪里有什么变化吗?有收获到什么吗?没什么很特别的事情发生。又能...
    抬头望见月_阅读 196评论 0 0
  • 哈哈!真不容易,小宝今晚就是不睡,拿着个车,玩的很认真,并且还要坐在我的腿上,我看着他玩得那么认真开心不忍...
    爱你的贝贝阅读 193评论 1 1
  • 今天嘉琪照常做我给他规划的作业,下午的时候我给她检查,讲解,真是漏洞百出,粗心大意,经过我的讲解会了不少,嘉琪,妈...
    嘉琪妈咪阅读 109评论 0 0
  • 可能是晚上坐在地上太久着凉了,又或者是这几天烟抽得太多了,第二天一早,夏雪头昏脑胀,咽喉肿痛,吞口水都发梗。她迷迷...
    枨不戒阅读 453评论 0 1