This question already has answers here:
How to assign values to dynamic names variables

(2个答案)


7年前关闭。




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

最佳答案

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而不是X_Drug_Rep[[1]]来访问第一个Drug_Rep项目。

关于R-如何动态命名数据帧?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17255851/

10-12 17:11
查看更多