R 分配给列表中的第 i 个索引,其名称在循环中可变调用?

R Assign to the ith index in a list, the name of which is called variably in a loop?

首先,这很难解释,特别是考虑到我是 coding/R 及其命名法的新手,所以感谢您的耐心和时间(命运参考!)。

我有一个数据框名称列表,在一个循环中我拉出一个,然后我进入第二个循环,在这个循环中我想 assign() 一个值给该名称的当前(内循环)迭代.换句话说,在内部循环中,我想迭代地为数据框赋值,其名称在外部循环中发生变化。

names <- c("alex","bec","kate")
states <- c("ACT","NSW","QLD","NT")

for (i in seq_along(names)){
    count <- 1
    curr.name = names[i]  #get current name
    assign(curr.name,list()) #preallocate list

    for (j in seq_along(states)) {
         x = matrix(rexp(200, rate=.1*j), ncol=10) #example data
         assign(curr.name[[count]], colMeans(x)) #here's my problem
        count <- count+1
    }
}

一旦计数==2,它告诉我下标越界,因为它试图将值分配给 curr.name(2),而 curr.name(2) 不存在。相反,我想将这些值分配给 curr.name 的第 j 个索引,即 alex[[2]],这样它看起来像

> alex
[[1]]
 [1] 1.952008 2.387436 1.745254 2.532774 3.174661 2.616323 1.713760 1.417643 3.328726
[10] 2.951489

[[2]]
 [1] 2.007752 2.856600 2.702416 1.370758 2.496893 2.383102 2.987076 2.838724 2.386669
[10] 2.125972

etc. 4 sets of means (one for each state) per name.

可能有更好的方法来组织我的数据,但是我正在处理其他人的代码,与此同时我只想让事情对他们有用,然后再研究我们如何优化它。

提前致谢。

您可以用以下代码替换有问题的行:

assign(curr.name,c(get(curr.name),list(colMeans(x))))

当然还有很大的优化空间

这是使用嵌套 lapply() 调用的一种方法

## set up a function to do the work on each list element
f <- function(x) colMeans(matrix(rexp(200, rate =.1 * x), ncol = 10))
## run the loops 
out <- lapply(setNames(, names), function(a) lapply(seq_along(states), f))
## view the result
str(out)
# List of 3
# $ alex:List of 4
# ..$ : num [1:10] 14.71 10.83 8.78 9.07 11.75 ...
# ..$ : num [1:10] 4.83 5.62 4.39 6.21 3.64 ...
# ..$ : num [1:10] 3.06 3.75 2.89 3.16 3.13 ...
# ..$ : num [1:10] 1.45 3.01 3.57 2.82 3.52 ...
# $ bec :List of 4
# ..$ : num [1:10] 7.78 10.2 11.63 5.52 16.48 ...
# ..$ : num [1:10] 5.75 4.82 4.14 4.51 3.21 ...
# ..$ : num [1:10] 2.5 4.44 3.26 2.72 4.62 ...
# ..$ : num [1:10] 2.19 2.5 1.9 2.88 2.51 ...
# $ kate:List of 4
# ..$ : num [1:10] 8.24 16.52 9.41 7.71 11.72 ...
# ..$ : num [1:10] 4.78 5.46 3.43 4.64 4.64 ...
# ..$ : num [1:10] 4.18 2.58 3.59 3.96 4.04 ...
# ..$ : num [1:10] 2.38 2.68 2.31 2.01 4.18 ...