簡體   English   中英

使用lapply將功能應用於文件的讀入列表並將輸出另存為新文件列表

[英]Using lapply to apply a function over read-in list of files and saving output as new list of files

我在R上還很新,對我認為很可能會做的普通操作有些停滯。 我需要執行一些基本功能,其中包含許多文件(57個文件,按6列累加約15億行)。 我可以讀取這些文件並執行計算,我沒有問題,但是我在最終輸出中遇到了麻煩。 我設想該函數一次處理一個文件,輸出工作文件並移至下一個文件。

經過計算,我想輸出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將功能應用於數據幀列表,並將輸出保存到名稱不同的文件中

編寫data.frames列表以使用lapply分隔CSV文件

沒有運氣。 對於輸入x個文件,對每個文件執行相同的功能,然后輸出相同數量的x文件,我深表感謝。 謝謝。

將輸出定向到同一文件的原因可能是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")

使用您的代碼,這是一般的想法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM