可以在R中执行的动态变量

时间:2015-01-25 09:55:56

标签: r

我喜欢在R中创建单独的变量,每个变量读取不同的表格如下:

AA_1_11 <- read.table(File_AA_1_11.dta,header=TRUE))
AA_2_22 <- read.table(File_AA_2_22.dta,header=TRUE))
AA_3_33 <- read.table(File_AA_3_33.dta,header=TRUE))
AA_4_44 <- read.table(File_AA_4_44.dta,header=TRUE))
BB_1_11 <- read.table(File_BB_1_11.dta,header=TRUE))
BB_2_22 <- read.table(File_BB_2_22.dta,header=TRUE))
BB_3_33 <- read.table(File_BB_3_33.dta,header=TRUE))
BB_4_44 <- read.table(File_BB_4_44.dta,header=TRUE))

通过here,我设法创建了单独的变量,并为每个变量分配了一个数值 x 。 x可以很容易地用x的函数方程替换, f(x)

char_list <- c("AA", "BB")
num_list <- c("1_11", "2_22", "3_33", "4_44")
x <- 1
for (char in char_list) {
  for (num in num_list) {   
    assign(paste(char,num, sep = '_'), x)  
    x <- x + 1
  }
}

同样的方法似乎不适用于以下。它没有执行读表。

char_list <- c("AA", "BB")
num_list <- c("1_11", "2_22", "3_33", "4_44")
for (char in char_list) {
  for (num in num_list) {   
    temp <- paste('"D:/File_',ant,'_',sta,'.dta"',sep = '')
    assign(paste(char,num, sep = '_'), read.table(temp,header=TRUE))  
  }
}

来自HELP库 - assign(x,value)语法不确定 value 是否仅适用于数字。

如果有其他方法可以创建单独的变量并执行以通过每个变量读取不同的读取表,请指导吗?

更新:列表 @Roland的实验建议。如果这是建议的话,不太明白。

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

char_num_list <- list()

for (char in char_list) {
  char_num_list[[char]] <- list()
  for (num in num_list) {
    char_num_list[[char]][[num]] <- paste('"D:/File_',char,'_',num,'.dta"',sep = '')
    assign(paste(char,num, sep = '_'), read.table(char_num_list[[char]][[num]],header=TRUE))  
  }
}

1 个答案:

答案 0 :(得分:2)

当您使用列表时,也不需要使用assign。将所有内容放入列表的整个想法是避免使用assign设置变量。

示例data.frame,因为我无法读取您的文件:

a <- data.frame(a=runif(50))

<强>解决方案

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

char_num_list <- list()

for (char in char_list) {
  char_num_list[[char]] <- list()
  for (num in num_list) {
    temp <- paste('"D:/File_',char,'_',num,'.dta"',sep = '') #save the path for each file
    char_num_list[[char]][[num]] <- a #I am using a here but you should be using your read.table   
  }
}
#replace a with read.table(temp,header=TRUE) for your tables

<强>输出:

> str(char_num_list)
List of 2
 $ AA:List of 4
  ..$ 1_11:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
  ..$ 2_22:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
  ..$ 3_33:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
  ..$ 4_44:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
 $ BB:List of 4
  ..$ 1_11:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
  ..$ 2_22:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
  ..$ 3_33:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...
  ..$ 4_44:'data.frame':    50 obs. of  1 variable:
  .. ..$ a: num [1:50] 0.24 0.383 0.89 0.675 0.736 ...

正如您通过使用列表所看到的那样,您根本不使用分配,这将使您的生活更加轻松。