对多个变量执行相同的操作,分配结果

问题描述 投票:0回答:2

我正在一个项目中,我必须对多个变量应用相同的转换。例如

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或其他内容中会更容易,但这是不可能的。

r reference pass-by-reference
2个回答
2
投票

通常,如果您发现自己对多个对象执行相同的操作,则应将它们存储/考虑为带有子组件的单个对象。您说不可能将它们存储为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

1
投票

该问题指出要递增的变量不能具有较大的结构,但是在注释中指出,毕竟不是那样,因此我们将假定它们位于列表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
© www.soinside.com 2019 - 2024. All rights reserved.