当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R Extract 提取或替换对象的部分


R语言 Extract 位于 base 包(package)。

说明

作用于向量、矩阵、数组和列表以提取或替换部分的运算符。

用法

x[i]
x[i, j, ... , drop = TRUE]
x[[i, exact = TRUE]]
x[[i, j, ..., exact = TRUE]]
x$name
getElement(object, name)

x[i] <- value
x[i, j, ...] <- value
x[[i]] <- value
x$name <- value

参数

x , object

从中提取元素或替换元素的对象。

i , j , ...

指定要提取或替换的元素的索引。索引是 numericcharacter 向量或空(缺失)或 NULL 。数字值被 as.integer 强制转换为整数或整数,或者被 trunc 强制转换为大值(因此被截断为零)。字符向量将与对象的 names 匹配(或者对于矩阵/数组,dimnames ):有关更多详细信息,请参阅下面的“字符索引”。

仅适用于 [ 索引: ij... 可以是逻辑向量,指示要选择的元素/切片。如果需要匹配相应的范围,这些向量将被回收。 ij... 也可以是负整数,表示要排除在选择之外的元素/切片。

当通过 [ 索引数组时,单个参数 i 可以是一个矩阵,其列数与 x 的维度一样多;结果是一个向量,其元素对应于 i 的每行中的索引集。

NULL 的索引值被视为 integer(0)

name

文字字符串或name(可能是backtick 引用)。对于提取,这通常(参见“环境”下)与对象的 names 部分匹配。

drop

对于矩阵和数组。如果TRUE,结果将被强制为尽可能低的维度(请参阅示例)。这只适用于提取元素,不适用于替换。有关更多详细信息,请参阅drop

exact

通过字符向量提取时控制 [[ 可能的部分匹配(对于大多数对象,但请参阅“环境”下)。默认情况下不进行部分匹配。值 NA 允许部分匹配,但在发生时会发出警告。值 FALSE 允许部分匹配,而不会发出任何警告。

value

通常是类似数组的R类似类的对象x.

细节

这些运算符是通用的。您可以编写方法来处理特定对象类的索引,请参阅 InternalMethods 以及 [.data.frame[.factor 。此处的说明仅适用于默认方法。请注意,当索引发生在表达式的赋值端时,替换函数 [<-[[<-$<- 需要使用单独的方法。

[[[$ 之间最重要的区别是 [ 可以选择多个元素,而其他两个则选择单个元素。

请注意,x[[]] 始终是错误的。

对于原子向量、矩阵/数组和递归(list-like,请参阅is.recursive)对象,默认方法的用法方式略有不同。 $ 仅对递归对象(和 NULL )有效,并且仅在下面有关递归对象的部分中讨论。

子集化(空索引除外)将删除除 namesdimdimnames 之外的所有属性。

索引可以出现在表达式的右侧以进行提取,也可以出现在左侧以进行替换。当索引表达式出现在赋值的左侧(称为子赋值)时,x 的该部分将设置为赋值右侧的值。在这种情况下,不会进行字符索引的部分匹配,并且根据需要强制左侧接受值。对于向量,答案将是层次结构中原始 < 逻辑 < 整数 < 双精度 < 复杂 < 字符 < 列表 < 表达式中 xvalue 类型中较高的类型。属性被保留(尽管 namesdimdimnames 将进行适当调整)。子分配是按顺序完成的,因此如果多次指定索引,则会生成索引的最新分配值。

将这些运算符中的任何一个应用于不可子集化的对象(例如函数)都是错误的。

原子载体

索引的常见形式是 [[[ 可用于选择删除 names 的单个元素,而 [ 保留它们,例如在 c(abc = 123)[1] 中。

索引对象i可以是数字、逻辑、字符或空。允许按因子进行索引,这相当于按数字代码进行索引(请参阅 factor ),而不是按打印的字符值进行索引(为此使用 [as.character(i)] )。

空索引选择所有值:这最常用于替换所有条目,但保留 attributes

矩阵和数组

矩阵和数组是具有维度属性的向量,因此所有索引向量形式都可以与单个索引一起使用。结果将是一个未命名的向量,除非 x 是一维的,而它是一个一维数组。

维数组进行索引的最常见形式是将 索引指定为 [ 。对于向量索引,索引可以是数字、逻辑、字符、空甚至因子。同样,按因子索引相当于按数字代码索引,请参阅上面的“原子向量”。

空索引(逗号分隔的空白)表示选择该维度中的所有条目。参数 drop 适用于这种形式的索引。

索引的第三种形式是通过每个维度有一列的数字矩阵:然后索引矩阵的每一行选择数组的单个元素,结果是一个向量。索引矩阵中不允许有负索引。允许 NA 和零值:索引矩阵中包含零的行将被忽略,而包含 NA 的行会在结果中生成 NA

如果数组具有维度名称,则还支持通过每个维度一列的字符矩阵进行索引。与数字矩阵索引一样,索引矩阵的每一行选择数组的单个元素。索引与适当的维度名称进行匹配。允许NA,并将在结果中生成NA。不允许使用不匹配的索引以及空字符串 (""),这将导致错误。

通过矩阵索引获得的向量将是未命名的,除非 x 是一维的,此时行名称(如果有)将被索引以提供结果名称。

递归 (list-like) 对象

[ 索引类似于原子向量,并选择指定元素的列表。

[[$ 都选择列表中的单个元素。主要区别在于 $ 不允许计算索引,而 [[ 允许。 x$name 相当于 x[["name", exact = FALSE]] 。此外,[[ 的部分匹配行为可以使用exact 参数进行控制。

getElement(x, name)x[[name, exact = TRUE]] 的一个版本,对于正式分类 (S4) 的对象,它返回 slot(x, name) ,因此提供对更通用的 list-like 对象的访问。

[[[ 有时应用于其他递归对象,例如 callexpression 。配对列表(例如调用)被 [ 强制转换为列表以进行提取,但所有三个运算符都可以用于替换。

[[ 可以递归地应用于列表,因此,如果单个索引 i 是长度为 p 的向量,则 alist[[i]] 相当于 alist[[i1]]...[[ip]] 提供列表中除最终索引结果之外的所有结果。

请注意,在所有三种替换中,值 NULL 都会删除列表中的相应项目。要将条目设置为 NULL ,您需要 x[i] <- list(NULL)

什么时候$<-被应用到一个NULL x,它首先强制xlist()。这也是发生的情况[[<-在哪里R版本小于 4.y.z,长度为 1 值导致长度为 1(原子)向量.

环境

$[[ 都可以应用于环境。仅允许字符索引,并且不进行部分匹配。这些操作的语义是 get(i, env = x, inherits = FALSE) 的语义。如果未找到匹配项,则返回 NULL。也可以使用替换版本 $<-[[<- 。同样,只允许字符参数。本例中的语义是 assign(i, value, env = x, inherits = FALSE) 的语义。此类分配将创建新绑定或更改 x 中的现有绑定。

索引中的 NA

提取时,数字、逻辑或字符 NA 索引选取未知元素,因此在逻辑、整数、数字、复数或字符结果的相应元素中返回 NA,并在列表中返回 NULL。 (它返回 00 作为原始结果。)

替换时(即在赋值的左侧使用索引)NA 不会选择任何要替换的元素。由于是否应使用 rhs 的元素存在歧义,因此仅当 rhs 值的长度为 1 时才允许这样做(因此两种解释将具有相同的结果)。 (S 的记录行为是 NA 替换索引“无处可去”,但耗尽了 value 的一个元素:Becker 等人,第 359 页。但是,其他实现并非如此。)

参数匹配

请注意,这些操作并不以标准方式匹配其索引参数:忽略参数名称,仅使用位置匹配。因此 m[j = 2, i = 1] 相当于 m[2, 1] 而不是 m[1, 2]

对于为它们定义的方法来说,情况可能并非如此;例如,对于 [.data.frame 中说明的 data.frame 方法来说,情况并非如此,如果 ij 被命名并且在这种情况下具有未记录的行为,则会发出警告。

为避免混淆,请勿命名索引参数(但必须命名 dropexact)。

S4方法

这些运算符也是隐式 S4 泛型,但作为原语,S4 方法将仅在 S4 对象 x 上分派。

$$<- 运算符的隐式泛型的签名中没有 name,因为语法只允许 name 参数使用符号或字符串常量。

字符索引

在某些情况下,字符索引可以部分匹配(请参阅pmatch) 到被子集化的对象的名称或暗名称(但绝不用于子分配)。与 S(贝克尔等人p。 358),R提取时从不使用部分匹配[,并且默认情况下不使用部分匹配[[(参见论证exact)。

因此,默认行为是仅在通过 $ 从递归对象(环境除外)中提取时才使用部分匹配。即使在这种情况下,也可以通过 options(warnPartialMatchDollar = TRUE) 打开警告。

空索引 ( "" ) 和 NA 索引都不匹配任何名称,甚至不匹配空名称或缺失名称。如果任何对象没有名称或适当的暗名称,它们将被视为全部"",因此不匹配。

错误情况

尝试对不可能执行此操作的对象应用子集化操作会发出 notSubsettableError 类错误。错误条件的 object 组件包含不可子集化的对象。

下标越界错误被标记为 subscriptOutOfBoundsError 类错误。错误条件的 object 组件包含正在被子集化的对象。对于向量下标,整数 subscript 分量为零,对于多个下标,指示哪个下标超出范围。 index 组件包含错误的索引。

例子

x <- 1:12
m <- matrix(1:6, nrow = 2, dimnames = list(c("a", "b"), LETTERS[1:3]))
li <- list(pi = pi, e = exp(1))
x[10]                 # the tenth element of x
x <- x[-1]            # delete the 1st element of x
m[1,]                 # the first row of matrix m
m[1, , drop = FALSE]  # is a 1-row matrix
m[,c(TRUE,FALSE,TRUE)]# logical indexing
m[cbind(c(1,2,1),3:1)]# matrix numeric index
ci <- cbind(c("a", "b", "a"), c("A", "C", "B"))
m[ci]                 # matrix character index
m <- m[,-1]           # delete the first column of m
li[[1]]               # the first element of list li
y <- list(1, 2, a = 4, 5)
y[c(3, 4)]            # a list containing elements 3 and 4 of y
y$a                   # the element of y named a

## non-integer indices are truncated:
(i <- 3.999999999) # "4" is printed
(1:5)[i]  # 3

## named atomic vectors, compare "[" and "[[" :
nx <- c(Abc = 123, pi = pi)
nx[1] ; nx["pi"] # keeps names, whereas "[[" does not:
nx[[1]] ; nx[["pi"]]

## recursive indexing into lists
z <- list(a = list(b = 9, c = "hello"), d = 1:5)
unlist(z)
z[[c(1, 2)]]
z[[c(1, 2, 1)]]  # both "hello"
z[[c("a", "b")]] <- "new"
unlist(z)

## check $ and [[ for environments
e1 <- new.env()
e1$a <- 10
e1[["a"]]
e1[["b"]] <- 20
e1$b
ls(e1)

## partial matching - possibly with warning :
stopifnot(identical(li$p, pi))
op <- options(warnPartialMatchDollar = TRUE)
stopifnot( identical(li$p, pi), #-- a warning
  inherits(tryCatch (li$p, warning = identity), "warning"))
## revert the warning option:
options(op)

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

names 用于名称匹配的详细信息,pmatch 用于部分匹配。

listarraymatrix

[.data.frame[.factor 适用于 data.frame 和因子时的行为。

Syntax 用于运算符优先级,以及有关索引详细信息的“R 语言定义”手册。

NULL 了解索引空对象的详细信息。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Extract or Replace Parts of an Object。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。