當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。