【上一篇:75.关于原子向量类型的强制转换和向量元素的命名】
【下一篇:77.关于列表-Recursive vectors】
四种取子集的方式
对向量取子集有四种方式:1)索引方式;2)逻辑值方式;3)名字方式;4)中括号留空。
索引方式:指定一个仅包含正值、负值或0的numeric vectors,值代表元素索引。可以全是正值,也可以全是负值,也可以是0,但正值和负值不能混合使用。全是正值表示从向量中提取对应索引处的元素,全是负值表示从向量中剔除对应索引处的元素,0则返回空值。对全是正值的情况,值可以重复,返回的结果中元素也会重复。向量是矢量的,也就是有方向的,要跟集合区分开。
> x <- c("one", "two", "three", "four", "five")
# 全正值
> x[c(3, 2, 5)]
[1] "three" "two" "five"
# 重复正值
> x[c(1, 1, 5, 5, 5, 2)]
[1] "one" "one" "five" "five" "five" "two"
# 全负值
> x[c(-1, -3, -5)]
[1] "two" "four"
逻辑值方式:一个长度等于输入向量的逻辑向量,返回对应位置处为TRUE的元素。
> x <- c(10, 3, NA, 5, 8, 1, NA)
> x[!is.na(x)]
[1] 10 3 5 8 1
名字方式:对命名向量(named vectors),可以通过其名字取子集。
> x <- c(abc = 1, def = 2, xyz = 5)
> x[c("xyz", "def")]
xyz def
5 2
中括号留空方式:x[]返回向量本身。这种方式对向量没有用处,但在data frame和tibble中,可以通过留空保留所有的行或列。例如:
mtcars[,c("mpg")]:提取mpg列,行数保持不变
mtcars[mtcars$mpg>18,]:提取mpg>18的行,列不变
中括号中,逗号前后分别表示数据框的两个维度:行和列,留空表示不对哪个维度进行操作
取子集函数
上文提到的取子集方法实际上使用了函数:"[",这是针对向量取子集的一个工具。这个函数还有一个变形:"[["。后者仅仅提取单个元素且总是丢掉名字。例如:
> x <- c(abc = 1, def = 2, xyz = 5)
# 取两个元素,结果带名字
> x[c("abc","def")]
abc def
1 2
# 取一个元素,结果带名字
> x[c("abc")]
abc
1
# 取一个元素,扔掉名字
> x[[c("abc")]]
[1] 1
# 不能对多个元素进行操作
> x[[c("abc","def")]]
Error in x[[c("abc", "def")]] :
attempt to select more than one element in vectorIndex
"["和"[["在向量中的使用频率并不大,但列表中的应用尤其重要。下一篇就是将列表了,敬请关注。
【上一篇:75.关于原子向量类型的强制转换和向量元素的命名】
【下一篇:77.关于列表-Recursive vectors】
网友评论