我正在尝试创建1000个变量,我想用索引号来命名。我不知道如何创建这些新变量。
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainController {
@RequestMapping("/")
public String home(Map<String, Object> model) {
model.put("message", "HowToDoInJava Reader !!");
return "index";
}
}
答案 0 :(得分:4)
这是人们通常想做的事情,尤其是当他们来自其他编程语言时。但是,有更好的方法可以完成同一件事,因此您不应该遵循建议使用assign
;那是不好的建议,您以后可能会后悔。
我们在R中做这种事情的方式是使用列表,特别是命名列表:
x <- replicate(1000,rnorm(200,0,1),simplify = FALSE)
x <- setNames(x,paste0("A",seq_along(x)))
现在x
是一个长度为1000的命名列表,每个元素都是正态(0,1)分布中长度为200的向量。
您可以根据需要通过x[[1]]
或x[["A1"]]
进行引用。此外,由于它们都在同一个对象中,因此您可以使用lapply
之类的工具轻松地对它们进行操作。
几乎每当您发现自己想要创建具有相似名称的对象序列时,就应该向您发出信号,表明您应该使用列表代替。
答案 1 :(得分:3)
用太多变量弄乱环境毫无意义,请尝试将它们存储在命名列表中
l1 <- setNames(lapply(1:5, function(x) rnorm(5)), paste0("A", 1:5))
l1
#$A1
#[1] 0.4951453 -1.4278665 0.5680115 0.3537730 -0.7757363
#$A2
#[1] -0.11096037 0.05958700 0.02578168 1.00591996 0.54852030
#$A3
#[1] 0.1058318 0.6988443 -0.8213525 -0.1072289 0.8757669
#$A4
#[1] -0.6629634 0.8321713 -0.3073465 -0.2645550 -1.0064132
#$A5
#[1] 2.2191246 0.2054360 -0.1768357 1.6875302 -1.1495807
现在您可以访问单个列表元素为
l1[["A1"]]
#[1] 0.4951453 -1.4278665 0.5680115 0.3537730 -0.7757363
此外,另一种方法是一起生成所有数字,然后split
将它们放入列表中。
groups = 5
each = 5
setNames(split(rnorm(groups * each), rep(seq_len(groups), each = each)),
paste0("A", seq_len(groups)))
答案 2 :(得分:1)
我与其他人一样,这不是一个好主意。无论如何,回答您的问题是怎么做到的
k <- 1000 # number of variables
n <- 200 # sample size of each variable
for(i in 1:k){
assign(paste0("variable", i), rnorm(n, 0, 1))}
variable1
-0.012947062 0.728284959 -1.627796366 0.003471491 ...
但是,我个人更希望使用另一种解决方案。到目前为止,这两个答案都建议使用列表。我发现lsts非常麻烦,尤其是如果您不熟悉R。因此,我建议创建一个矩阵,其中每一列都包含一个变量。
# creates a matrix
m <- matrix(rep(NA, n*k), ncol= k)
# generates rnorm() in each column
for(i in 1:k){
m[ , i] <- rnorm(n, 0, 1)
}
# now you can name the columns
colnames(m) <- paste0("variable", 1:k)
m
variable1 variable2 ...
[1,] 0.30950749 -2.07388046
[2,] -1.13232330 -0.55511476
...