簡體   English   中英

對多個變量執行相同的操作,分配結果

[英]Perform same operation to multiple variables, assigning result

我正在做一個項目,我必須對多個變量應用相同的轉換。 例如

a <- a + 1
b <- b + 1
d <- d + 1
e <- e + 1

我顯然可以使用

for (i in c(a, b, d, e)) i <- i + 1

但是,我實際上無法以這種方式將結果分配給每個變量,因為i是每個變量的副本,而不是引用。

有沒有辦法做到這一點? 顯然,如果將變量合並到 data.frame 或其他東西中會更容易,但這是不可能的。

通常,如果您發現自己對多個對象執行相同的操作,則應將它們存儲/考慮為具有子組件的單個對象。 你說將這些存儲為 data.frame 是不可能的,所以你可以使用列表代替。 這允許您使用lapply / sapply將函數應用於列表的每個元素。

a <- c(1, 2, 3)
b <- c(1, 4)
c <- 5
d <- rnorm(10)
e <- runif(5)

lstt <- list(a = a, b = b, c = c, d = d, e = e)
lstt$a
# [1] 1 2 3

lstt <- lapply(lstt, '+', 1)
lstt$a
# [1] 2 3 4

問題指出要遞增的變量不能在更大的結構中,但在評論中指出這畢竟不是這樣,所以我們假設它們在列表L

L <- list(a = 1, b = 2, d = 3, e = 4) # test data

for(nm in names(L)) L[[nm]] <- L[[nm]] + 1

# or
L <- lapply(L, `+`, 1)

# or
L <- lapply(L, function(x) x + 1)

標量

如果它們都是標量,那么它們可以放在一個普通的向量中:

v <- c(a = 1, b = 2, d = 3, e = 4)
v <- v + 1

向量

如果它們都是相同長度的向量,則可以將它們放入數據框中,或者如果它們也是相同類型,則可以將它們放入矩陣中,在這種情況下,我們也可以將其加 1。

環境

如果變量在環境中必須是自由的,那么如果nms是變量名稱的向量,那么我們可以迭代名稱並使用這些名稱來下標環境env 如果名稱遵循某種模式,我們可以使用nms <- ls(pattern = "...", envir = env)或者如果它們是該環境中唯一的變量,我們可以使用nms <- ls(env)

a <- b <- d <- e <- 1 # test data

env <- .GlobalEnv  # can change this if not being done in global envir
nms <- c("a", "b", "d", "e")

for(nm in nms) env[[nm]] <- env[[nm]] + 1

a;b;d;e  # check
## [1] 2
## [1] 2
## [1] 2
## [1] 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM