#r #csv
Вопрос:
У меня есть 200 csv-файлов с именами «a.csv», «b.csv», «c.csv» и т.д..
В каждом csv-файле есть два столбца: «тип» и «изобилие». Я хотел бы изменить имя столбца изобилия в каждом файле 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)
})
Ответ №1:
Что-то вроде этого:
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 или аналогичная, если 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)