Как сгенерировать массивный набор данных из каталога сотен файлов .csv с уникальными метками для столбцов [R]?

#r #dataframe

#r #dataframe

Вопрос:

Я хотел бы попытаться выполнить следующее:

  1. У меня есть папка с сотнями файлов .csv, каждый из которых нужно извлечь и проанализировать только в R для их первого столбца — это относительные интенсивности ячеек.
  2. Я хотел бы, чтобы скрипт а) перебирал каталог, б) извлекал и импортировал каждый файл .csv в виде фрейма данных или вектора, в) помечал каждый с помощью восходящей системы маркировки и г) повторно объединял их для получения всеобъемлющего набора данных для дальнейшего анализа (каждый фрейм данных представляет собойразличная обработка ячеек)

Вот некоторый код, поскольку я получаю отрицательные отзывы за то, что не сделал этого иначе:

 #data are sort of structured like this, as relative intensities of a cell from an image:
set.seed(1234)
df1 <- sample(100:1000, 100, replace = T)  
df2 <- sample(100:1000, 100, replace = T)
df3 <- sample(100:1000, 100, replace = T)
df4 <- sample(100:1000, 100, replace = T)
df5 <- sample(100:1000, 100, replace = T)
 
 #this will be the subfolder where all the .csvs are located, not as it is here:
my_direct <- "~./"

#this will be the list of files:
my_files <- list.files(path=my_direct, pattern="*.csv", full.names=TRUE)

#this should retrieve over 100 .csv files, all with just one column needed for further analysis:

#then I wanted to do this....
dfs <- lapply(myfiles, read.delim)
 
 #but that just generates an amorphous blob of a list -
#I need each belonging to it's own column, labeled differently, so that I can cbind to generate a massive dataset

#so I tried this:
map(my_files, fread, select = 'Intensity Sum Ch=3 Img=1') %>%
  bind_cols

#and it produced similar results or collapses the data
 

Я чувствую, что это прямо передо мной (делаю какую-то магию цикла for), но, похоже, я тоже не могу найти решение здесь.
Предложения?

Ответ №1:

Вот решение, использующее lapply

 #this will be the subfolder where all the .csvs are located, not as it is here:
my_direct <- "~./"

#this will be the list of files:
my_files <- list.files(path=my_direct, pattern="*.csv", full.names=TRUE)

# read each file in list
data_list = lapply(my_files, function(i){
  data <- read.csv(i, stringsAsFactors = F)
# Make changes to data as required
})

# merge all elements of list into data.table
data_dt <- setDT(
  unlist(data_list, recursive = FALSE),
  check.names = TRUE
)[]
 

Комментарии:

1. Спасибо за это. Но разве я не стал бы использовать cbind и нет rbind ? Мне нужны уникальные столбцы, потому что происходит то, что данные считываются, но затем накладываются друг на друга, и я понятия не имею, откуда они взялись. Они должны храниться в виде уникальных столбцов.

2. Примите ответ, если он вам помог.

3. Он по-прежнему не запускается для меня. Я получаю следующую ошибку: error in read.table(file = file, header = header, sep = sep, quote = quote, : more columns than column names