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
),其中包含每个数据帧的相关结果。
问题来了:
- 列表
cor
与每个数据帧的相关结果看起来有值而不是数据帧,所以我不知道如何访问或保存它们(参见 corr
列表 Environment/Data window)。好吧,到这里为止,至少看起来某处存在相关结果。
- 第二个问题是,当我运行
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)
我几乎完成了一个 messy code 将几个统计 methods/test 应用于来自不同流域的 11 个数据帧,其中物理化学参数作为变量。我达到了目标,但我需要执行此功能。
因此,首先我创建了一个函数来计算相关性,并将结果保存为 .txt tables 和 .pdf 图像。
当 运行 函数一次到一个数据帧时效果很好(为此你应该使用 read.table
单独导入每个数据帧,这没有写在下面的代码中)。
因为我希望它起作用,所以列出了 11 个数据帧,并使用 lapply
到 运行 每个数据帧的功能。它的工作原理是给我一个列表(corr
),其中包含每个数据帧的相关结果。
问题来了:
- 列表
cor
与每个数据帧的相关结果看起来有值而不是数据帧,所以我不知道如何访问或保存它们(参见corr
列表 Environment/Data window)。好吧,到这里为止,至少看起来某处存在相关结果。 - 第二个问题是,当我运行
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)