函数内的write.table应用于数据帧列表覆盖输出

时间:2019-12-17 14:15:45

标签: r pdf lapply overwrite write.table

我几乎完成了messy code,将几种统计方法/检验应用于来自不同流域的11个数据帧,并将其理化参数作为变量。我达到了目标,但我需要执行此功能。 因此,我首先创建了一个计算相关性的功能,并将结果保存为.txt表和.pdf图像。 一次将功能运行到一个数据框时,它的效果很好(为此,您应该使用read.table分别导入每个数据框,这不在下面的代码中编写)。 如我所愿,它列出了11个数据帧,并使用lapply对每个数据帧运行该函数。从某种意义上讲,它的工作原理是给我一个包含每个数据帧相关结果的列表(corr

问题来了:

  1. 每个数据帧具有相关性结果的列表cor看起来像是具有值而不是数据帧,所以我不知道如何访问或保存它们(请参阅“环境/数据”窗口中的corr列表)。好吧,直到这里,至少看起来好像相关结果存在于某个地方。
  2. 第二个问题是,当我运行corr<-lapply(PQ_data, cor_PQ)时,该行使用所计算的原始数据帧名称的一部分将输出保存为表(.txt)和图像(.pdf)(例如,第一行PQ_data的元素是"AgIX_E_PQ",因此cor_PQ(PQ_data[["AgIX_E_PQ"]]的表和图应分别获得名称“ mCorAgIX_E_PQ.txt”和“ CorAgIX_E_PQ.pdf”,而仅获得一个输出(mCorX [[ I]]。txt和CorX [[i]]。pdf)以及最后一个数据帧相关结果。也就是说,每个数据帧相关结果的表和图像都将覆盖到此通用mCorX [[I]]。txt,CorX [[i]]。pdf文件中。

现在我想必须定义“ i”或类似的东西来避免这种情况。我应该为cor_PQ定义PQ_data函数而不是X吗?

如果任何人都可以看到我失败的地方,请解决该问题,我将不胜感激。

我的数据:PQ_data /将其保存在您的工作空间中,并用它修复setwd。 我的代码:

rm(list=ls(all=TRUE))
cat("\014")

setwd("C:/Users/Sol/Documents/ProyectoTítulo/CalidadAgua/Matrices/Regs") #my workspace

PQ_files<-list.files(path="C:/Users/Sol/Documents/ProyectoTítulo/CalidadAgua/Matrices/Regs",
                     pattern="\\_PQ.txt") #my list of 14 dataframes in my workspace.
PQ_data<-lapply(PQ_files, read.table) #read tables of the 14 dataframes in the list.
names(PQ_data)<-gsub("\\_PQ.txt","", PQ_files) #name the 14 dataframes with their original names.

#FUNCTION TO COMPUTE CORRELATIONS, SAVE TABLES AND PLOTS.
cor_PQ<-function(X) {
  corPQ<-cor(X, use="pairwise.complete.obs")
  outputname.txt<-paste0("mCor",deparse(substitute(X)),".txt")
  write.table(corPQ, file=outputname.txt)
  outputname.pdf<-paste0("Cor",deparse(substitute(X)),".pdf")
  pdf(outputname.pdf)
  plot(X)
  dev.off()
  return(corPQ)
}

corr<-lapply(PQ_data, cor_PQ)

此后,正如我所说,获得一个名为“ corr”的列表,其中包含11个元素,这些元素包含来自列表(PQ_data)中每个数据帧的相关结果,但是当我固定“ corr”时,无法将它们作为表访问在我的环境/数据窗口中列出(它们不显示蓝色R箭头以展开元素)。 ` 而且我只得到2个输出文件,分别称为mCorX [[I]]。txt和CorX [[i]]。pdf,它们仅显示最后一个数据帧相关结果,因为write.table和.pdf函数会覆盖10个先前计算的结果。 再次,我将不胜感激。我真的需要努力去抓住这个主意。 谢谢!!!

1 个答案:

答案 0 :(得分:1)

lapply不会将列表名称发送给函数。因此,尽管该功能适用​​于单个文件,但不适用于文件列表。同样,由于文件没有名称,所以所有生成的文件都使用相同的名称,因此所有新文件都将覆盖先前存在的文件,最后只输出1个文件,这是列表中的最后一个元素。您可以使用以下函数,在该函数中,我们将名称作为不同的参数发送,以将名称分配给文件。

cor_PQ<-function(X, Y) {
   corPQ<-cor(X, use="pairwise.complete.obs")
   outputname.txt<-paste0("mCor",Y,".txt")
   write.table(corPQ, file= outputname.txt)
   outputname.pdf<-paste0("Cor",Y,".pdf")
   pdf(outputname.pdf)
   plot(X)
   dev.off()
   return(corPQ)
}

现在使用Map来应用相同的功能。

Map(cor_PQ, PQ_data, names(PQ_data))

我们还可以使用imap中的purrr来应用此功能。

purrr::imap(PQ_data, cor_PQ)