![](/img/trans.png)
[英]Using lapply to apply a function over list of data frames and saving output to files with different names
[英]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.