北京大学R语言教程(李东风)第7章: R向量下标和子集

在R中下标与子集是极为强大的功能,
需要一些练习才能熟练掌握,
许多其它语言中需要多个语句才能完成的工作在R中都可以简单地通过下标和子集来完成。

7.1 正整数下标

对向量x, 在后面加方括号和下标可以访问向量的元素和子集。

x <- c(1, 4, 6.25)
x[2]取出第二个元素;
x[2] <- 99修改第二个元素。
x[c(1,3)]取出第1、3号元素;
x[c(1,3)] <- c(11, 13)修改第1、3号元素。
下标可重复。
例如

x <- c(1, 4, 6.25)
x[2]
## [1] 4
x[2] <- 99; x
## [1]  1.00 99.00  6.25
x[c(1,3)]
## [1] 1.00 6.25
x[c(1,3)] <- c(11, 13); x
## [1] 11 99 13
x[c(1,3,1)]
## [1] 11 13 11

7.2 负整数下标

负下标表示扣除相应的元素后的子集,如

x <- c(1,4,6.25)
x[-2]
## [1] 1.00 6.25
x[-c(1,3)]
## [1] 4

负整数下标不能与正整数下标同时用来从某一向量中取子集,
比如,x[c(1,-2)]没有意义。

7.3 空下标与零下标

x[]表示取x的全部元素作为子集。
这与x本身不同,比如

x <- c(1,4,6.25)
x[] <- 999
x
## [1] 999 999 999
x <- c(1,4,6.25)
x <- 999
x
## [1] 999

x[0]是一种少见的做法,
结果返回类型相同、长度为零的向量,
numeric(0)
相当于空集。

当0与正整数下标一起使用时会被忽略。
当0与负整数下标一起使用时也会被忽略。

7.4 下标超界

设向量x长度为n,
则使用正整数下标时下标应在{1,2,…,n}中取值。
如果使用大于n的下标,
读取时返回缺失值,并不出错。
给超出n的下标元素赋值,
则向量自动变长,
中间没有赋值的元素为缺失值。
例如

x <- c(1,4,6.25)
x[5]
## [1] NA
x
## [1] 1.00 4.00 6.25
x[5] <- 9
x
## [1] 1.00 4.00 6.25   NA 9.00

虽然R的语法对下标超界不视作错误,
但是这样的做法往往来自不良的程序思路,
而且对程序效率有影响,
所以实际编程中应避免下标超界。

7.5 逻辑下标

下标可以是与向量等长的逻辑表达式,
一般是关于本向量或者与本向量等长的其它向量的比较结果,如

x <- c(1,4,6.25)
x[x > 3]
## [1] 4.00 6.25

取出x的大于3的元素组成的子集。

逻辑下标除了用来对向量取子集,
还经常用来对数据框取取子集,
也用在向量化的运算中。
例如,对如下示性函数

f(x)={1,0,x≥0x<0

输入向量x,结果y需要也是一个向量,程序可以写成

f <- function(x){
  y <- numeric(length(x))
  y[x >= 0] <- 1
  y[x < 0] <- 0 # 此语句多余
  
  y
}

事实上,向量化的逻辑选择有一个ifelse()函数,
比如,对上面的示性函数,
如果x是一个向量,
输出y向量可以写成y <- ifelse(x>=0, 1, 0)

要注意的是,如果逻辑下标中有缺失值,
对应结果也是缺失值。
所以,在用逻辑下标作子集选择时,
一定要考虑到缺失值问题。正确的做法是加上!is.na前提,

x <- c(1, 4, 6.25, NA)
x[x > 2]
## [1] 4.00 6.25   NA
x[!is.na(x) & x > 2]
## [1] 4.00 6.25

7.6 which()which.min()which.max()函数

函数which()可以用来找到满足条件的下标,

x <- c(3, 4, 3, 5, 7, 5, 9)
which(x > 5)
## [1] 5 7
seq(along=x)[x > 5]
## [1] 5 7

这里seq(along=x)会生成由x的下标组成的向量。
which.min()which.max求最小值的下标和最大值的下标,
不唯一时只取第一个。如

which.min(x)
## [1] 1
which.max(x)
## [1] 7

7.7 元素名

向量可以为每个元素命名。如

ages <- c("李明"=30, "张聪"=25, "刘颖"=28)

ages <- c(30, 25, 28)
names(ages) <- c("李明", "张聪", "刘颖")

ages <- setNames(c(30, 25, 28), c("李明", "张聪", "刘颖"))

这时可以用元素名或元素名向量作为向量的下标,如

ages["张聪"]
## 张聪 
##   25
ages[c("李明", "刘颖")]
## 李明 刘颖 
##   30   28
ages["张聪"] <- 26

这实际上建立了字符串到数值的映射表。

用字符串作为下标时,
如果该字符串不在向量的元素名中,
读取时返回缺失值结果,
赋值时该向量会增加一个元素并以该字符串为元素名。

带有元素名的向量也可以是字符型或其它基本类型,如

sex <- c("李明"="男", "张聪"="男", "刘颖"="女")

除了给向量元素命名外,
在矩阵和数据框中还可以给行、列命名,
这会使得程序的扩展更为容易和安全。

R允许仅给部分元素命名,
这时其它元素名字为空字符串。
不同元素的元素名一般应该是不同的,
否则在使用元素作为下标时会发生误读,
但是R语法允许存在重名。

unname(x)返回去掉了元素名的x的副本,
names(x) <- NULL可以去掉x的元素名。

7.8 用R向量下标作映射

R在使用整数作为向量下标时,允许使用重复下标,
这样可以把数组x看成一个1:n的整数到
x[1], x[2], , x[n]的一个映射表,
其中nx的长度。
比如,某商店有三种礼品,编号为1,2,3,
价格分别为68, 88和168。令

price_map <- c(68, 88, 168)

设某个收银员在一天内分别售出礼品编号为3,2,1,1,2,2,3,
可以用如下的映射方式获得售出的这些礼品对应的价格:

items <- c(3,2,1,1,2,2,3)
y <- price_map[items]; print(y)
## [1] 168  88  68  68  88  88 168

R向量可以用字符型向量作下标,
字符型下标也允许重复,
所以可以把带有元素名的R向量看成是元素名到元素值的映射表。
比如,设sex为10个学生的性别(男、女)

sex <- c("男", "男", "女", "女", "男", "女", "女", "女", "女", "男")

希望把每个学生按照性别分别对应到蓝色和红色。
首先建立一个R向量当作映射

sex_color <- c("男"="blue", "女"="red")

用R向量sex.color当作映射,可以获得每个学生对应的颜色

cols <- sex_color[sex]; print(cols)
##     男     男     女     女     男     女     女     女     女     男 
## "blue" "blue"  "red"  "red" "blue"  "red"  "red"  "red"  "red" "blue"

这样的映射结果中带有不必要的元素名,
unname()函数可以去掉元素名,如

unname(cols)
##  [1] "blue" "blue" "red"  "red"  "blue" "red"  "red"  "red"  "red"  "blue"

7.9 集合运算

可以把向量x看成一个集合,但是其中的元素允许有重复。
unique(x)可以获得x的所有不同值。如

unique(c(1, 5, 2, 5))
## [1] 1 5 2

a %in% x判断a的每个元素是否属于向量x,如

5 %in% c(1,5,2)
## [1] TRUE
c(5,6) %in% c(1,5,2)
## [1]  TRUE FALSE

%in运算符类似,
函数match(x, table)对向量x的每个元素,
从向量table中查找其首次出现位置并返回这些位置。
没有匹配到的元素位置返回NA_integer_(整数型缺失值)。

match(5, c(1,5,2))
## [1] 2
match(5, c(1,5,2,5))
## [1] 2
match(c(2,5), c(1,5,2,5))
## [1] 3 2
match(c(2,5,0), c(1,5,2,5))
## [1]  3  2 NA

intersect(x,y)求交集,结果中不含重复元素,如

intersect(c(5, 7), c(1, 5, 2, 5))
## [1] 5

union(x,y)求并集,结果中不含重复元素,如

union(c(5, 7), c(1, 5, 2, 5))
## [1] 5 7 1 2

setdiff(x,y)求差集,即x的元素中不属于y的元素组成的集合,
结果中不含重复元素,如

setdiff(c(5, 7), c(1, 5, 2, 5))
## [1] 7

setequal(x,y)判断两个集合是否相等,
不受次序与重复元素的影响,如

setequal(c(1,5,2), c(2,5,1))
## [1] TRUE
setequal(c(1,5,2), c(2,5,1,5))
## [1] TRUE

7.10 练习

设文件class.csv内容如下:

name,sex,age,height,weight
Alice,F,13,56.5,84
Becka,F,13,65.3,98
Gail,F,14,64.3,90
Karen,F,12,56.3,77
Kathy,F,12,59.8,84.5
Mary,F,15,66.5,112
Sandy,F,11,51.3,50.5
Sharon,F,15,62.5,112.5
Tammy,F,14,62.8,102.5
Alfred,M,14,69,112.5
Duke,M,14,63.5,102.5
Guido,M,15,67,133
James,M,12,57.3,83
Jeffrey,M,13,62.5,84
John,M,12,59,99.5
Philip,M,16,72,150
Robert,M,12,64.8,128
Thomas,M,11,57.5,85
William,M,15,66.5,112

用如下程序可以把上述文件读入为R数据框d.class,
并取出其中的name和age列到变量name和age中:

d.class <- read.csv("class.csv", header=TRUE, stringsAsFactors=FALSE)
name <- d.class[,"name"]
age <- d.class[,"age"]
  1. 求出age中第3, 5, 7号的值;
  2. 用变量age, 求出达到15岁及以上的那些值;
  3. 用变量name和age, 求出Mary与James的年龄。
  4. 求age中除Mary与James这两人之外的那些人的年龄值,保存到变量age1中。
  5. 假设向量x长度为n, 其元素是{1,2,…,n}的一个重排。
    可以把x看成一个i到x[i]的映射(i在{1,2,…,n}中取值)。
    求向量y, 保存了上述映射的逆映射,即:
    如果x[i]=j, 则y[j]=i。

韭菜热线原创版权所有,发布者:风生水起,转载请注明出处:https://www.9crx.com/77745.html

(0)
打赏
风生水起的头像风生水起普通用户
上一篇 2023年10月26日 00:37
下一篇 2023年10月27日 01:06

相关推荐

  • 嘉信理财市场观点:滚动复苏?

    随着美国经济增长继续出乎意料地上行,投资者一再重新考虑对美联储何时以及多快开始降息的预期。这导致美国国债市场出现一定程度的波动,这种波动可能会持续到通胀和美联储政策调整时机更加明朗为止。同时,我们解释了为什么尽管目前存在地缘政治风险,但油价不太可能持续进一步升值。 美国股市和经济:正在展开滚动复苏吗? 有早期迹象表明,美国各个行业或地区之前的一些“滚动衰退”…

    2024年5月16日
    7800
  • 如何成功地量入为出?如何收入微薄,还能管理好自己的钱?

    你有没有想过,为什么有些人尽管收入微薄,却似乎毫不费力地管理自己的钱?答案可能在于一种名为“量入为出”的财务策略。个人理财的重要组成部分一旦掌握,就可以实现长期的财务稳定。该策略主要涉及了解您的收入、制定预算以及实施战略性财务实践以减少支出。 量入为出意味着什么 量入为出是一项基本的财务原则,包括在收入和支出之间建立平衡,以便您在不承担债务的情况下履行自己的…

    2023年8月29日
    16600
  • 微信上怎么 投诉 银行?(微信扫码到银行码,可以投诉吗?)

    微信扫码到银行码,可以投诉吗 微信投诉不了中国银行哦以下几种方法可以猛茄进行投诉:1、投诉者可以用书面形式向银监会进行投诉,详细叙述事情的经过以及投诉的问题;2、投诉者可以致电中国银行总行进行投诉,国家总行就会做出记录再联系客户投诉的支行进行核查;3、投诉者可以去市内的银行总行或拨打市内总行服务热线进行投诉;4、投诉者直接联系所投诉的银行,樱高与该行及时查清…

    2023年1月18日
    57600
  • 新兴或前沿市场的配置有时可能会提高风险调整后的回报

    今天飙升的通货膨胀、不断上升的利率和数十亿美元的投资欺诈很好地提醒我们,清楚地了解过去有助于我们更好地预测未来。事实上,它可以为我们制定投资组合分配决策提供可靠的基础。 这就是为什么我们需要牢牢掌握不同股票市场过去的相对和绝对表现。毕竟,如果不是不同资产的相对表现不佳和表现优异,那么是什么推动了市场周期呢? 考虑到这一点,股票市场按地区、国家、行业、市值和风…

    2023年8月14日
    20400
  • 消费者面临的阻力

    作者:拉里·亚当 (Larry Adam) 要点 温和衰退仍然是我们的基本预测 消费者面临的阻力正在增加 借贷成本飙升构成风险 本周我们庆祝了全国调度日——每个人都有“重来”或第二次机会的一天。我确信有很多高尔夫球手、天气预报员和其他人时不时地要求进行调度。但与高尔夫球手不同的是,经济学家对经济衰退时间的预测并不常见。然而,在这个周期中,经济学家一直呼吁经济…

    2023年10月27日
    13500

发表回复

登录后才能评论
客服
客服
关注订阅号
关注订阅号
分享本页
返回顶部