R中的动态变量

时间:2015-01-23 23:32:23

标签: r

我正在使用RStudio(版本3.0.2)和R.

的新手

在我的任务中,想在RScript中创建以下变量并赋值。

AA_1_11 <- 1
AA_2_22 <- 2
AA_3_33 <- 3
AA_4_44 <- 4
BB_1_11 <- 5
BB_2_22 <- 6
BB_3_33 <- 7
BB_4_44 <- 8

而是静态创建上面的8行。我打算动态编码那些代码,以便在将来变量扩展时代码是有用的,即AA,BB,以后可以扩展到CC,DD等。

尝试以下代码:

char_list <- c("AA", "BB")
num_list <- c("1_11", "2_22", "3_33", "4_44")

i=1
char_num_array <-vector()
for (char in char_list) {
  for (num in num_list) {
    char_num_array[i] <- paste(char,num, sep = '_') 
    i <- i + 1
  }
}

(char_num_array)

for (j in 1:length(char_num_array)){ 
   char_num_array[j] <- j
}

虽然我可以将所有变量名称创建为字符串名称,但不知道为什么实际变量不是在RStudio中创建的,如下图所示。

enter image description here

希望你能指导我。

更新

感谢大家的帮助。我真的想制作单独的变量,以便我可以监视RStudio上值的变化,因为变量将不断用于其他操作,即拟合,重新安装等。

感谢JDB。我已将代码修改为以下,其中 i 可以替换为其他数学方程式。

char_list <- c("AA", "BB")
num_list <- c("1_11", "2_22", "3_33", "4_44")

i <- 1
for (char in char_list) {
  for (num in num_list) {   
    assign(paste(char,num, sep = '_'), i)       
    i <- i + 1
  }
}

2 个答案:

答案 0 :(得分:6)

你不需要循环。执行此类操作的首选“R方式”是将所有这些变量保留在列表中。除了保持全局环境“干净”之外,这使得更容易引用变量,并且还可以更容易地在以后对它们执行操作。

例如,对于此操作,您可以执行

char_list <- c("AA", "BB")
num_list <- c("1_11", "2_22", "3_33", "4_44")

x <- setNames(
    as.list(1:8),
    paste(rep(char_list, each=4), num_list, sep="_")
)

现在您想要的变量都存储在x

names(x)
# [1] "AA_1_11" "AA_2_22" "AA_3_33" "AA_4_44" "BB_1_11"
# [6] "BB_2_22" "BB_3_33" "BB_4_44"

可以使用$按姓名访问,[[[使用with(),使用x$AA_1_11 # [1] 1 x[[5]] # [1] 5 with(x, c(AA_1_11, BB_4_44)) # [1] 1 8 等等按名称或号码访问...

{{1}}

答案 1 :(得分:3)

您的代码中没有任何意义,您要告诉R创建这些变量。你的第一个循环成功地创建了你想要的名字的矢量列表(一个字符串),但它并没有将任何值作为变量赋值。

但是,R非常擅长动态变量创建。为什么要将相同的值分配给一堆不同的变量?你能用这些变量创建一个数据框吗?

array <- data.frame(variables = numeric(length(char_num_array)))
rownames(array) <- char_num_array
array
        variables
AA_2_22         0
AA_3_33         0
AA_4_44         0
BB_1_11         0
BB_2_22         0
BB_3_33         0
BB_4_44         0

如果确实想要将它们创建为单独的变量,则可以使用assign():

for(item in char_num_array) assign(item, 1)