переименовать столбец в имя файла — несколько csv-файлов R

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