0

我对 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 输出期间一直在读取文件命名函数的内容来看,可能是我尚未与脚本的其余部分完全对齐的键之一。我一直在查看许多其他我认为适用的问题:

使用 lapply 对数据框列表应用函数并将输出保存到具有不同名称的文件中

使用 lapply 写入 data.frames 列表以分隔 CSV 文件

没有运气。我非常感谢在输入 x 个文件、在每个文件上执行相同的功能、然后输出相同的 x 个文件时朝着正确方向的任何见解或路径。谢谢你。

4

2 回答 2

1

输出被定向到同一个文件的原因可能是file = paste0(names(DF), "txt", sep=".")每次迭代都返回相同的值。也就是说,DF在每次迭代中必须具有相同的列名,因此names(DF)将是相同的,并且paste0(names(DF), "txt", sep=".")将是相同的。与该append = TRUE选项一起,结果是所有输出都写入同一个文件。

在匿名函数内部,x是输入文件的名称。names(DF)您可以对此字符串进行一些转换,而不是用作输出文件名的基础。

例子。

给定

x <- "/foo/raw_data.csv"

在函数内部你可以做这样的事情

infile <- x
outfile <- file.path(dirname(infile), gsub('raw', 'clean', basename(infile)))

outfile
[1] "/foo/clean_data.csv"

然后使用新名称进行输出,使用append = FALSE(除非您需要它为真)

write.table(DF, file = outfile, row.names = FALSE, col.names = FALSE, append = FALSE, fileEncoding = "UTF-8")
于 2017-07-19T17:03:49.980 回答
0

使用您的代码,这是一般的想法:

require(purrr)

#list filenames 
files <- list.files(path=, pattern="*.txt", full.names=TRUE, recursive=FALSE)


#Call calculated height average a name
R_ref= 1647.038203

dfTransform <- function(file){
  colnames(file) <- c("X","Y","Z","I","A","FC")

  #Calculate return
  file$R_calc <- (R_ref - file$Z)/cos(file$A*pi/180)

  #Calculate intensity
  file$Ir_calc <- file$I * (file$R_calc^2/R_ref^2)
  return(file)
}

output <- files %>% map(read.table,header = FALSE, sep= "\t") %>%
  map(dfTransform) %>%
  map(write.table, file=paste0(names(DF), "txt", sep="."),
  row.names = FALSE, col.names = FALSE, append = TRUE,fileEncoding = "UTF-8")
于 2017-07-19T16:52:15.917 回答