R-如何动态命名数据帧?

时间:2013-06-22 22:21:07

标签: r variables dynamic dataframe

我的目录中有两种类型的文件。每种类型都有文本“Drug_Rep”,如果不存在,则表示它是一个控制文件。 药物数据具有重复数量,其数量可以变化,对照也是如此。 我正在读取for循环中的文件,如下所示。 我想将我的数据帧命名为X_Drug_Rep1,然后将下一个命名为X_Drug_Rep2,依此类推...并保存数据帧以供进一步处理。 对控件执行相同操作... X_CONTROL_Rep1 ... X_CONTROL_Rep2 ...依此类推。 将数据保存到数据帧的语法是什么,因为我需要稍后在药物复制数据帧和控件上进行一些合并和计算。 粘贴在作业的左侧似乎不起作用。有什么建议吗?

for (f in 1:length(fileList)){
    fileName <- fileList[f]
    X <-read.xls(fileName)

    if(regexpr("Drug_Rep", fileName)[1]>0){
      print("DRUG")
      print(fileName)
      paste(X_Drug_Rep,i)<-X
      i=i+1
    }
    else{
      print("CONTROL")
      print(fileName)
      paste(X_CONTROL,j)<-X
      j=j+1
    }
  }

1 个答案:

答案 0 :(得分:15)

OP真的很挣扎,所以我会在这里向他展示,而不是长篇评论。不关心这是否会被关闭。

技术(不做那个答案)就是使用assign

i <- 1
j <- 1
for (f in 1:length(fileList)){
    fileName <- fileList[f]
    X <-read.xls(fileName)

    if(grepl("Drug_Rep", fileName)) {
      print("DRUG")
      print(fileName)
      assign(paste("X_Drug_Rep", i, sep = '_'), X)
      i <- i+1
    } else {
      print("CONTROL")
      print(fileName)
      assign(paste("X_CONTROL", i, sep = '_'), X)
      j <- j+1
    }
  }

但正如我们建议的那样,您应该使用列表。使用for循环,它看起来像这样:

X_Drug_Rep <- list()
X_CONTROL  <- list()
i <- 1
j <- 1
for (f in 1:length(fileList)){
    fileName <- fileList[f]
    X <-read.xls(fileName)

    if(grepl("Drug_Rep", fileName)) {
      print("DRUG")
      print(fileName)
      X_Drug_Rep[[i]] <- X
      i <- i+1
    } else {
      print("CONTROL")
      print(fileName)
      X_CONTROL[[j]] <- X
      j <- j+1
    }
  }

最后,如果没有for循环,您的代码将如何显示:

drug.rep.files <- grep("Drug_Rep", fileList, value = TRUE)
control.files  <- grep("Drug_Rep", fileList, value = TRUE, invert = TRUE)

X_Drug_Rep <- lapply(drug.rep.files, read.xls)
X_CONTROL  <- lapply(control.files, read.xls)

更短,没有?!同样,这会创建两个列表。例如,您可以通过X_Drug_Rep_1访问第一个Drug_Rep项而不是X_Drug_Rep[[1]]