我几乎完成了messy code,将几种统计方法/检验应用于来自不同流域的11个数据帧,并将其理化参数作为变量。我达到了目标,但我需要执行此功能。
因此,我首先创建了一个计算相关性的功能,并将结果保存为.txt表和.pdf图像。
一次将功能运行到一个数据框时,它的效果很好(为此,您应该使用read.table
分别导入每个数据框,这不在下面的代码中编写)。
如我所愿,它列出了11个数据帧,并使用lapply
对每个数据帧运行该函数。从某种意义上讲,它的工作原理是给我一个包含每个数据帧相关结果的列表(corr
。
问题来了:
cor
看起来像是具有值而不是数据帧,所以我不知道如何访问或保存它们(请参阅“环境/数据”窗口中的corr
列表)。好吧,直到这里,至少看起来好像相关结果存在于某个地方。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个先前计算的结果。
再次,我将不胜感激。我真的需要努力去抓住这个主意。
谢谢!!!
答案 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)