R 对于循环对象名,迭代
我正在从事一个项目,在这个项目中,我必须进行大量的重复,如果我能够在for循环中处理多个对象,生活就会轻松得多。为了证实我的问题,我举了一个(愚蠢的)例子 例如,如果您这样做是为了创建我的数据:R 对于循环对象名,迭代,r,R,我正在从事一个项目,在这个项目中,我必须进行大量的重复,如果我能够在for循环中处理多个对象,生活就会轻松得多。为了证实我的问题,我举了一个(愚蠢的)例子 例如,如果您这样做是为了创建我的数据: for (i in 1:10) { assign(paste("Season",i, sep = ""),rnorm(10,0,1)) } 所以我有第一季,第二季,第十季。 是否可以使用for循环将10个对象中的第一个对象数更改为零。半伪代码如下所示。但这当然行不通 for (i in 1:10)
for (i in 1:10)
{
assign(paste("Season",i, sep = ""),rnorm(10,0,1))
}
所以我有第一季,第二季,第十季。
是否可以使用for循环将10个对象中的第一个对象数更改为零。半伪代码如下所示。但这当然行不通
for (i in 1:10)
{
Seasoni[1]<-0
}
for(1:10中的i)
{
第I季[1]您的问题的直接解决方案是使用get
和paste
for(i in 1:10)
{
Object = get(paste0("Season", i))
Object[1] = 0
assign(paste0("Season", i), Object)
}
但不要这样做
这是一个可怕的R用法。正如评论中所建议的,将结果存储在列表中:
Seasons = lapply(rep(10,10), rnorm) #Generate data
Seasons
然后应用函数:
Seasons = lapply(Seasons, replace, list=1, values=0)
这里有一个基于@joran评论的解决方案
> set.seed(1) # for reproducibility
> # the following does the same as your `for` loop and returned value is a list
> Season.list <- replicate(10, rnorm(10, 0, 1), simplify=FALSE)
> # giving some names
> names(Season.list) <- paste0("Season", 1:length(Season.list))
> # setting first element to 1
> Season.list <- lapply(Season.list, function(x) {x[1] <- 0; x})
> list2env(Season.list, envir = .GlobalEnv) # will give you each `Season` as you want :D
解决方案是不将数据存储在名为“季节1”、“季节2”等的单独对象中,而是将它们全部放在一个列表中。然后,您可以使用lappy
等工具将它们作为一个组进行操作。
> set.seed(1)
> Season <- replicate(10, rnorm(10, 0, 1)) # the returned object is a matrix
> colnames(Season) <- paste0("Season", 1:ncol(Season))
> Season[1,] <- 0
> attach(as.data.frame(Season))
> Season1
[1] 0.0000000 0.1836433 -0.8356286 1.5952808 0.3295078 -0.8204684 0.4874291 0.7383247 0.5757814 -0.3053884
> Season2
[1] 0.00000000 0.38984324 -0.62124058 -2.21469989 1.12493092 -0.04493361 -0.01619026 0.94383621 0.82122120
[10] 0.59390132