我還沒有測試過,因爲我顯然沒有你的數據,但像下面的代碼應該工作。基本上,你創建一個包含所有文件名的矢量,然後一次讀取,合併和寫入它們中的10個。
library(reshape2)
library(dplyr)
# Get the names of all the csv files
files = list.files(pattern="csv$")
# Read, combine, and save ten files at a time in each iteration of the loop
for (i in (unique(1:length(files)) - 1) %/% 10)) {
# Read ten files at a time into a list
dat = lapply(files[(1:length(files) - 1) %/% 10 == i], function(f) {
d=read.csv(f, header=TRUE, stringsAsFactors=FALSE)
# Add file name as a column
d$file = gsub("(.*)\\.csv$", "\\1", f)
return(d)
})
# Combine the ten files into a single data frame
dat = bind_rows(dat)
# Reshape from long to wide format
dat = dcast(Frequency ~ file, value.var="Voltage")
# Write to csv
write.csv(dat, paste("Files_", i,".csv"), row.names=FALSE)
}
在另一方面,如果你只想他們都合併到長格式的單個文件,這將使得分析變得更容易(如果你當然有足夠的內存):
# Read all files into a list
dat = lapply(files, function(f) {
d = read.csv(f, header=TRUE, stringsAsFactors=FALSE)
# Add file name as a column
d$file = gsub("(.*)\\.csv$", "\\1", f)
return(d)
})
# Combine into a single data frame
dat = bind_rows(dat)
# Save to csv
write.csv(dat, "All_files_combined.csv", row.names=FALSE)
尼斯一個@ eipi10,感謝您的快速回復。 14號線我真的很感激,一直在尋找!幾個問題; 1)你能解釋'in'函數嗎?找不到對它的引用。 2)第14行'rbind'或'bind_rows',它看起來像你的設置數據的行,我用來傳播工作表和矩陣組數據,你能解釋爲什麼嗎?這是一個R的東西?! –
'for(var in seq)'是我能想到的R中唯一的情況,其中'in'用於邏輯表達式中。這只是設置'for'循環迭代的一種方式。在這種情況下,我們使用它來選擇10行作爲時間。在其他上下文中,爲了在向量之間進行匹配,您可以使用'%in%'作爲'%y'中的'x%'。請參閱'?\'%在%\''和'?Control'中獲取更多信息。 – eipi10
關於'rbind'與'bind_rows':'rbind'是用於堆棧兩個數據幀或矩陣的基本R函數。但是,如果列表中有多個數據幀,並且想要將它們全部堆疊起來,則可以執行'do.call(rbind,dat)'。 'do.call'在整個數據幀列表上迭代調用'rbind'。 'bind_rows'是一個在整個列表上運行的'dplyr'函數。 'bind_rows(dat)'和'do.call(rbind,dat)'在這種情況下是等價的。但是,如果數據框不是全部具有相同的列名稱或相同數量的列,則'bind_rows'也可以工作。 – eipi10