我有 200 個名為“a.csv”、“b.csv”、“c.csv”等的 csv 檔案。
在每個 csv 檔案中,有兩列:“type”和“abundance”。我想將每個 csv 檔案中的豐度列的名稱更改為“a_abundance”、“b_abundance”等以匹配檔案名,然后使用新的列名保存 csv 檔案。
到目前為止,我有以下內容,但它不起作用。
filenames<- list.files(pattern = ".csv")
all_files <- lapply (filenames, function (x) {
file <- read.csv (x)
name= sub(".*", "", x)
colnames(file) <- paste (colnames(file), name, sep ='_')
return(file)
})
uj5u.com熱心網友回復:
像這樣的東西:
all_files <- lapply(setNames(nm=filenames), function(fn) {
dat <- read.csv(fn)
ind <- colnames(dat) == "abundance"
if (any(ind)) {
colnames(dat)[ind] <- paste0(tools::file_path_sans_ext(basename(fn)), "_abundance")
}
dat
})
以上將讀取資料并更改一列名稱。(您說只有一列,但您的代碼正在更改所有列……我將只使用名為 的那一列"abundance"。)
從這里,你可以重寫一個來自:
Map(write.csv, all_files, names(all_files))
## or ##
for (nm in names(all_files)) write.csv(all_files[[nm]], nm)
僅供參考,這可以在命令列(bash shell 或類似的,只要可用)上完成得更快,sed例如:
for fn in $(ls *.csv) ; do
BN=$(basename "$fn" .csv)
sed -i -E "1{s/abundance/${BN}_abundance/}" "$fn"
done
演練:
- 對于
BN,basename洗掉任何前導目錄組件,尾隨.csv從檔案名中洗掉該擴展名;這應該轉化./a.csv為a. - 對于
sed:-i對檔案進行就地修改;注意,這不會存盤原始檔案的備份;如果您改為使用,-i.bak則它會在修改檔案之前備份檔案,第一次嘗試時可能會更安全,然后您可以洗掉*.bak檔案-E是一個擴展表達的東西;你應該也能-e過得去,這對我來說只是習慣1意味著只在檔案的第一行應用這個規則s/from/to/將文本從from模式轉換為to模式,在這種情況下為前置${BN}_(大括號在 bash envvar 使用中有點防御性)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318538.html
上一篇:為不在我的資料庫中的日期生成圖表
