【发布时间】:2017-12-25 01:10:17
【问题描述】:
我是 R 的新手,有点坚持我认为可能是常见的操作。我有许多文件(57 个,大约 15 亿行,共 6 列),我需要在这些文件上执行基本功能。我可以读取这些文件并执行我不需要的计算,但我在最终输出中遇到了问题。我设想该功能一次处理一个文件,输出工作文件并移至下一个文件。
计算后,我想输出 57 个新的 .txt 文件,这些文件以输入数据最初来自的文件命名。到目前为止,我能够在较小的测试数据集上执行计算并吐出 1 个附加的 .txt 文件,但这不是我想要的最终输出。
#list filenames
files <- list.files(path=, pattern="*.txt", full.names=TRUE, recursive=FALSE)
#begin looping process
loop_output = lapply(files,
function(x) {
#Load 'x' file in
DF<- read.table(x, header = FALSE, sep= "\t")
#Call calculated height average a name
R_ref= 1647.038203
#Add column names to .las data
colnames(DF) <- c("X","Y","Z","I","A","FC")
#Calculate return
DF$R_calc <- (R_ref - DF$Z)/cos(DF$A*pi/180)
#Calculate intensity
DF$Ir_calc <- DF$I * (DF$R_calc^2/R_ref^2)
#Output new .txt with calcuated columns
write.table(DF, file=, row.names = FALSE, col.names = FALSE, append = TRUE,fileEncoding = "UTF-8")
})
我最近的代码尝试是搞乱初始的 lapply/sapply 函数:
#begin looping process
loop_output = sapply(names(files),
function(x) {
以及输出线:
#Output new .csv with calcuated columns
write.table(DF, file=paste0(names(DF), "txt", sep="."),
row.names = FALSE, col.names = FALSE, append = TRUE,fileEncoding = "UTF-8")
从我在 write.table 输出期间读取文件命名函数的内容来看,可能是我尚未与脚本的其余部分完全对齐的键之一。我一直在查看许多其他我认为适用的问题:
Write list of data.frames to separate CSV files with lapply
没有运气。我非常感谢任何关于输入 x 个文件、对每个文件执行相同功能、然后输出相同 x 个文件的正确方向的见解或路径。谢谢你。
【问题讨论】:
-
purrr包中的map()对此非常有效。您可以读取文件文件夹,将它们分开,并对每个文件执行相同的操作集。我会定义一个函数来执行必要的操作,然后读入、转换,然后用map()写入 -
所以
lapply代码的问题只是附加的文本文件? -
@Parfait 不,它得出了我想要的类似结论:即,它计算出我需要计算的内容并提供正确的输出。但是,我想输出 57 个单独的新文件,而不是 1 个附加文件,用于数据大小管理以及我想在工作流程的下一步中对文件执行的操作。
-
然后只需调整 file= 参数,就像@Damian 在您的
write.table中显示的那样,并添加一个return(DF),这样您的lapply就会返回一个数据帧列表而不是结果write.table()
标签: r loops for-loop lapply write.table