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

write.table inside a function applied to a list of data frames overwrite outputs

我几乎完成了一个 messy code 将几个统计 methods/test 应用于来自不同流域的 11 个数据帧,其中物理化学参数作为变量。我达到了目标,但我需要执行此功能。 因此,首先我创建了一个函数来计算相关性,并将结果保存为 .txt tables 和 .pdf 图像。 当 运行 函数一次到一个数据帧时效果很好(为此你应该使用 read.table 单独导入每个数据帧,这没有写在下面的代码中)。 因为我希望它起作用,所以列出了 11 个数据帧,并使用 lapply 到 运行 每个数据帧的功能。它的工作原理是给我一个列表(corr),其中包含每个数据帧的相关结果。

问题来了:

  1. 列表 cor 与每个数据帧的相关结果看起来有值而不是数据帧,所以我不知道如何访问或保存它们(参见 corr 列表 Environment/Data window)。好吧,到这里为止,至少看起来某处存在相关结果。
  2. 第二个问题是,当我运行 corr<-lapply(PQ_data, cor_PQ)时,其中有一行将输出保存为tables (.txt) 和图像(.pdf) using part计算的原始数据框的名称(例如 PQ_data 的第一个元素是 "AgIX_E_PQ" 所以 table 和 cor_PQ(PQ_data[["AgIX_E_PQ"]] 的图应该得到名称 "mCorAgIX_E_PQ.txt" 和 "CorAgIX_E_PQ.pdf"),我只得到一个输出(mCorX[[I]].txt 和 CorX[[i]].pdf)与最后一个数据帧相关结果。也就是说,tables 和每个数据帧相关结果的图像被覆盖到这个泛型 mCorX[[I]].txt, CorX[[i]].pdf 文件中。

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

如果有人能看到我失败的地方,请帮助我解决这个问题。

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

rm(list=ls(all=TRUE))
cat("4")

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) 中每个数据帧的相关结果,但我无法访问它们 tables 当我在我的 environment/data window 中固定 "corr" 列表时(它们不显示蓝色 R 箭头来展开元素)。 ` 我只得到 2 个名为 mCorX[[I]].txt 和 CorX[[i]].pdf 的输出文件,只显示最后一个数据帧相关结果,因为 write.table 和 .pdf 函数会覆盖前 10 个数据帧的结果计算。 再次,我将不胜感激任何帮助。我真的需要推动才能理解这个想法。 谢谢!!!

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))

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

purrr::imap(PQ_data, cor_PQ)