[英]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.