【问题标题】:R- how to dynamically name data frames? [duplicate]R-如何动态命名数据帧? [复制]
【发布时间】:2013-06-22 22:21:07
【问题描述】:

我的目录中有两种类型的文件。每种类型都有文本“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
    }
  }

【问题讨论】:

  • 这个问题很多。技术答案是使用assign,但首选方法是构建一个列表(在您的情况下为两个。)
  • 我确实点击了链接,但我仍然无法正确获取分配语法...这就是我所做的:assign(paste(X_Drug_Rep,i, sep='_'),一)
  • assign(paste("X_Drug_Rep", i, sep = '_'), X)
  • X_Drug_Rep_1 是一个对象,因此您可以通过键入 X_Drug_Rep_1 来访问它。如果您的意思是如何通过i &lt;- 1 之类的变量访问它,那么这也会被很多人问到。技术上的答案是使用get,但首选方法是将所有对象放在一个列表中开始。因此我再次建议:使用列表!
  • 如上所述,您可以为此目的使用assign,但您不应该。您可以将名称分配给列表之后,它是通过names(myList) &lt;- ... 构造的。这更清晰,更不容易出错,并且会导致代码更短。

标签: r variables dynamic dataframe


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2012-10-11
    • 2022-11-29
    • 2021-02-06
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多